nginx代理传递从java spring rest客户端请求中删除标头SM_USER

nginx代理传递从java spring rest客户端请求中删除标头SM_USER

我们正在使用 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第一个服务器部分中的指令。

相关内容