NGINX不传递响应头

时间:2016-08-31 22:03:07

标签: nginx spring-boot proxy spring-session

我有一个在端口8080上运行的java spring应用程序,此应用程序应返回标头'x-auth-token',此应用程序在nginx反向代理后面运行。

应用程序正确生成标题,当我直接请求它时(绕过nginx):

http://169.54.76.123:8080

它以响应标头集中的标头响应

但是当我通过nginx反向代理发出请求时,标题不会出现

https://169.54.76.123

nginx处理ssl终止。

我的nginx配置文件

upstream loadbalancer {
    server 169.54.76.123:8080 ;
}

server {
    listen      169.54.76.123:80;
    server_name api.ecom.com;
    return 301 https://api.ecom.com$request_uri;
}
server {
    listen 169.54.76.123:443 ssl;
    keepalive_timeout   70;
    server_name api.ecom.com;

    ssl_certificate /etc/ssl/api_chained.cert ;
    ssl_certificate_key /etc/ssl/api.key ;
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2 SSLv3 SSLv2;
    ssl_ciphers         ALL:!ADH:RC4+RSA:HIGH:!aNULL:!MD5;

    charset utf-8;

    location / {
        proxy_pass http://loadbalancer/$request_uri ;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

问题是:为什么nGinx不会将'x-auth-token'传递给响应?

如何将其纳入回复?

我试图在变量中获取值,但似乎nGinx没有它:

我使用$sent_http_x_auth_token$upstream_htto_x_auth_token,但这些变量不包含任何值(我认为)

我尝试使用这些变量自己添加标题:

add_header x-auth-token $sent_http_x_auth_token;没有成功

也尝试过:

add_header x-auth-token $upstream_http_x_auth_token;也没有成功。

另外,我试过了:

proxy_pass_header x-auth-token;

没有成功

有什么问题?我该怎么调试呢? 哪个部分阻止或阻止'x-auth-header'?上游或代理还是什么?

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

通常你应该做任何事情,因为nginx不会从响应中删除自定义标题。

您可以使用log_format指令来跟踪请求的执行情况,例如

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent '
                  'X-Auth-Token: "$sent_http_x_auth_token"';

access_log  logs/access.log  main;

在你的位置背景中。

检查时,您是否收到200响应代码,确认请求成功?

答案 1 :(得分:0)

sent_前缀不应存在。 记录客户标头的正确方法是在其前面加上http_前缀,然后将客户标头全部小写,并将破折号(-)转换为下划线(_)。例如,“ Custom-Header”将为http_custom_header

所以正确的记录方式是:

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_x_auth_token"';

access_log  logs/access.log  main;

还请注意,如果标题中包含下划线,则需要通过在nginx配置中添加以下内容来明确允许它:

underscores_in_headers on

如果要测试自定义标头,则可以使用curl:

curl -v -H "Custom-Header: any value that you want" http://www.yourdomain.com/path/to/endpoint

-H将添加标头,-v将显示已发送的请求和响应标头