Nginx

nginx 代理通過從 java spring rest 客戶端請求中刪除標頭 SM_USER

  • January 11, 2017

我們使用 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第一個伺服器部分中的指令。

引用自:https://serverfault.com/questions/825538