【问题标题】:NGINX do not pass response headerNGINX 不传递响应头
【发布时间】:2017-01-08 15:20:42
【问题描述】:

我有一个在 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”?上游或代理还是什么?

感谢您的帮助

【问题讨论】:

    标签: nginx spring-boot proxy spring-session


    【解决方案1】:

    通常你应该做任何事情,因为 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 响应代码?

    【讨论】:

      【解决方案2】:

      sent_ 前缀不应存在。 记录客户标头的正确方法是使用 http_ 作为前缀,然后将客户标头全部小写并将破折号 (-) 转换为下划线 (_)。例如“自定义标题”将是 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 将显示发送的请求和响应标头

      【讨论】:

        猜你喜欢
        • 2021-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-21
        • 2016-02-10
        • 1970-01-01
        • 2019-04-29
        • 1970-01-01
        相关资源
        最近更新 更多