Karp 的技术博客

今天发现生产环境自定义透传字段 头部转发IP, 错误.

观察了下 获取IP 方式并没有问题. 开发环境ok 的. 区别在于开发环境是直连的, 而生产是 Nginx Proxy

server {
        listen 8080;
        server_name localhost;
        access_log  /data/log/nginx/asset-access.log  main;
        error_log /data/log/nginx/asset-error.log error;

        location / {
                set $mode "test";
                if ($request_uri ~* xxxx=([0-9a-z]+)) {
                        set $mode $1;
                }

                proxy_pass http://swoole_assets;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $remote_addr;

        }
}
upstream swoole_assets{  
        server 10.0.0.1:5001;  
        server 10.0.0.2:1001;  
        hash $mode;
}

上面的配置 本身并没有问题.

问题在于 header name 的字符做了限制,默认 underscores_in_headersoff,表示如果header name 中包含下划线,则忽略掉。

恰好我自定义的 header 中都是用的下划线。

处理办法:
1、配置中 http 部分 增加 underscores_in_headers on; 配置

2、用减号 - 替代下划线符号 _,避免这种变态问题。nginx 默认忽略掉下划线可能有些原因。

可以加到 http 或者 server

语法:underscores_in_headers on|off
默认值:off
使用字段:http, server
是否允许在 header 的字段中带下划线。

文章中提到查询配置问题, 可以提高Nginx log 等级, 调整到debug 模式.

后来我在 nginx.conferror 的日志等级更改为 debug,查看 error_log logs/error.log debug;

解决问题文章 :

https://cloud.tencent.com/developer/article/1835815

nginx

版权属于:karp
作品采用:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
更新于: 2023年11月04日 12:31
8

目录

来自 《[踩坑] 解决nginx反向代理proxy不能转发header报头》