Nginx
nginx 代理通過從 java spring rest 客戶端請求中刪除標頭 SM_USER
我們使用 nginx 作為 java 應用程序的代理(都在 docker 容器中,但這可能不相關)。當我們嘗試通過一個特定的客戶端通過一個特定的標頭訪問 Java 應用程序時,SM_USER 會在代理通道中失去。奇怪的是:如果我們使用 CURL 或 PHP Zend Framework 或 Firefox rest 外掛來執行請求,代理傳遞配置工作。但是,如果我們使用 Java Spring REST 客戶端或 soapUI,標頭就會失去。如果我們繞過代理,它也可以在 Java/soapUI 上執行。
我們使用以下 nginx 配置:
server { listen 80; server_name devrest.example.com; root /devrestserver; underscores_in_headers on; location / { proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass_request_headers on; proxy_pass http://devrest:8080; } }
如您所見,我們使用 underscores_in_headers ;並明確設置 proxy_pass_request_headers ;在配置中。
nginx 接管之前的 tcpdump 向我們顯示 SM_USER 標頭正在到達伺服器:
GET /resource/RoomType/ HTTP/1.1 Accept: text/plain, application/json, application/*+json, */* Content-Type: application/json SM_USER: atnqtjrce0cjfve0fbjbsov2ff Accept-Language: de User-Agent: Java/1.7.0_71 Host: devrest.example.com Connection: keep-alive
docker 網路中的 tcpdump(在 nginx 代理和應用程序之間)顯示標頭消失了:
GET /resource/RoomType/ HTTP/1.0 X-Forwarded-Host: devrest.example.com X-Forwarded-Server: devrest.example.com X-Forwarded-For: 78.132.28.121 Host: devrest:8080 Connection: close Accept: text/plain, application/json, application/*+json, */* Content-Type: application/json Accept-Language: de User-Agent: Java/1.7.0_71
我也試過
proxy_pass_header SM_USER;
按照以下連結的建議 nginx 傳回自定義標頭
我嘗試使用以下內容顯式重命名標題:
proxy_set_header X-siteminderuser $http_sm_user;
這在執行 CURL 請求時工作得很好,但在使用 Java 時根本沒有出現。似乎 SM_USER 甚至在 $http_… 變數生效之前就被過濾掉了。
如果我在 java rest 客戶端中重命名標題並使用
proxy_set_header SM_USER $http_x_siteminder_user;
它通過了,但不幸的是,很難在原始的 java rest 客戶端(這是另一家公司的軟體)中進行更改,所以我非常感謝任何關於如何讓 SM_USER 標頭通過 nginx 代理的建議。你能幫助我們嗎?
你在這上面有另一個伺服器部分嗎?
nginx 論壇上的這個文章建議它只關注
underscores_in_headers
第一個伺服器部分中的指令。