解决nginx反向代理proxy不能转发header报头

#编程技术 2021-06-08 10:16:00 | 全文 377 字,阅读约需 1 分钟 | 加载中... 次浏览

👋 相关阅读


使用 nginx 做负载均衡或 http 代理时,碰到 http header 不转发的问题。

配置里只有转发设置原始 ip 和 host 的

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header     X-Forwarded-Server $host;

请求的内容也是正确的。

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

发现读取信息如下:

2017/11/20 14:27:56 [info] 5625#0: *1078154 client sent invalid header line: "access_token: JhbGciOiJSUzI1NiJ9.eyJqdGkiOiJKV1Q6NmJlNmE3ODUtMmNiZS00NTkwLThkYmQtMzI4MTI0ZTRjZDBiIiwiaWF0IjoxNTExMTU3NTkzLCJzdWIiOiJ7XCJjcmVhdGVUaW1lXCI6XCIyMDE3LTA3LTEwIDA5OjU5OjMyXCIsXCJlbWFpbFwiOlwiYWRtaW5AbTJjLmNvbVwiLFwibmFtZVwiOlwiYWRtaW5cIixcIm5vdGVcIjpcIm5vdGVcIixcInBlcm1pc3Npb25LZXlcIjpcIkpXVDpTWVNURU06UEVSTUlTU0lPTpkYmRjMjQ1ZGM5Mjg0MmY3OTAxY2ZjNGZiOWU3ZmY1OVwiLFwicm9sZUlkXCI6XCIxXCIsXCJ0ZWxOb1wiOlwiMTM4Mjg3NDk3NTVcIixcInVwZGF0ZVRpbWVcIjpcIjIwMTctMTEtMTcgMTY6MTY6MTdcIixcInVzZXJJZFwiOlwiNmM3MTFlOGUzZjA1MTIzNDUwZDgzMGI5NGM3MDRjY2E3OTlmXCIsXCJ1c2VyTmFtZVwiOlwiYWRtaW5cIixcInVzZXJOb1wilwiMVwiLFwidXNlclN0YXR1c1wiOlwiTk9STUFMXCJ9IiwiZXhwIjoxNTExMjAwNzkzfQ.ZrUmlI0FSC0FjUwXvReuj4YlHYyCdJrDx9e9B1OEazO3avmMEsGjZoWxxxxxxxAbtqv5sFa64_U0GL-RdE9fkQRWE9k8pSjYs34mOYI1qN_m3ZdbbEGioJ4OrY_IJj3qax5BPP9g9AejhFM9y8Z7zt7SV6YU" while reading client request headers, client: 10.0.40.102, server: api.xxxxxx.com, request: "GET /xxx.operxxxx/role/auth/get/modules?systemAccessToken=JhbGciOiJSUzI1NiJ9.eyJqdGkiOiJKV1Q6NmJlNmE3ODUtMmNiZS00NTkwLThkYmQtMzI4MTI0ZTRjZDBiIiwiaWF0IjoxNTExMTU3NTkzLCJzdWIiOiJ7XCJjcmVhdGVUaW1lXCI6XCIyMDE3LTA3LTEwIDA5OjU5OjMyXCIsXCJlbWFpbFwiOlwiYWRtaW5AbTJjLmNvbVwiLFwibmFtZVwiOlwiYWRtaW5cIixcIm5vdGVcIjpcIm5vdGVcIixcInBlcm1pc3Npb25LZXlcIjpcIkpXVDpTWVNURU06UEVSTUlTU0lPTjpkYmRjMjQ1ZGM5Mjg0MmY3OTAxY2ZjNGZiOWU3ZmY1OVwiLFwicm9sZUlkXCI6XCIxXCIsXCJ0ZWxOb1wiOlwiMTM4Mjg3NDk3NTVcIixcInVwZG0ZVRpbWVcIjpcIjIwMTctMTEtMTcgMTY6MTY6MTdcIixcInVzZXJJZFwiOlwiNmM3MTFlOGUzZjA1MTIzNDUwZDgzMGINGM3MDRjY2E3OTlmXCIsXCJ1c2VyTmFtZVwiOlwiYWRtaW5cIixcInVzZXJOb1wiOlwiMVwiLFwidXNlclN0YXR1c1wiOlwiTk9STUFMXCJ9IiwiZXhwIjoxNTExMjAwNzkzfQ.ZrUmlI0FSC0FjUwXvReuj4YlHYyCdJrDx9e9B1OEazO3avmMEsGjZoWxxxxxxxAbtqv5sFa64_U0GL-RdE9fkQRWE9k8pSjYs34mOYI1qN_m3ZdbbEGioJ4OrY_IJj3qax5BPP9g9AejhFM9y8Z7zt7SV6YU&roleId=SYSRC849xxxC7xx5CA64D349D6A03AAE2C511F4 HTTP/1.1", host: "api.xxxxxxx.com"

提示客户端发送无效的 header 信息。

原来是对 header name 的字符做了限制,默认 underscores_in_headers 为 off,表示如果header name 中包含下划线,则忽略掉。

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

处理办法:

1、配置中 http 部分 增加 underscores_in_headers on; 配置

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

可以加到 http 或者 server 中

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

via: 解决nginx反向代理proxy不能转发header报头_禅剑一如的技术博客_51CTO博客 https://blog.51cto.com/yanconggod/1983494

Edit | Last updated on 2024-04-08 15:48:44




×