我们正在使用 nginx 作为 Java 应用程序的代理(两者都在 docker 容器中,但这可能不相关)。当我们尝试通过 rest 客户端的特定标头访问 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 on; 并明确设置 proxy_pass_request_headers on;。
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 网络(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 传回自定义标头
我尝试使用以下命令明确重命名标题:
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 代理的建议。你能帮我们吗?
答案1
这上面还有另外一个服务器部分吗?
此主题nginx 论坛上建议它只关注underscores_in_headers
第一个服务器部分中的指令。