我们使用nginx作为java应用程序的代理(都在docker容器中,但这可能不相关)。 当我们试图通过rest客户端到达Java应用程序的特定头部时,SM_USER在代理通过中丢失。 奇怪的是:如果我们使用CURL或者PHP Zend Framework或者Firefox rest add-on来做请求,那么proxy passconfiguration就起作用了。 但是,如果我们使用Java Springrest客户端或soapUI,头部会丢失。 如果我们绕过代理它也从Java / soapUI工作。
我们使用下面的nginxconfiguration:
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; 在configuration中。
nginx接pipe之前的一个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
dockernetworking(在nginx代理和应用程序之间)中的tcpdump显示头部消失:
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传回自定义标题所build议的
我试图通过使用以下显式重命名标头:
proxy_set_header X-siteminderuser $http_sm_user;
在执行CURL请求时工作得很好,但完全没有使用Java。 在$ http _…variables生效之前,似乎SM_USER被过滤掉了。
如果我在java rest客户端重命名头并使用
proxy_set_header SM_USER $http_x_siteminder_user;
它通过,但不幸的是它很难得到原来的Javarest客户端(这是另一家公司的软件)这个变化,所以我真的很感激任何build议,我可以通过Nginx代理传递SM_USER头。 你能帮助我们吗?
你有上面的另一个服务器部分?
nginx论坛上的这个线程表明,它只关注第一个服务器部分中的underscores_in_headers指令。