从nginx代理服务器转发请求头

88

我正在使用Nginx作为代理来过滤请求到我的应用程序。借助于“http_geoip_module”,我正在创建一个国家代码的http-header,并且我想使用“headers-more-nginx-module”将其作为请求头传递。这是Nginx配置中的location块:

location / {
    proxy_pass                      http://mysite.com;
    proxy_set_header                Host http://mysite.com;;
    proxy_pass_request_headers      on;
    more_set_headers 'HTTP_Country-Code: $geoip_country_code';
}

但是这只设置了响应的头部。我尝试使用“more_set_input_headers”代替“more_set_headers”,但是头部甚至没有传递给响应。

我错过了什么?


还要检查一下是否在 Docker Swarm 集群内运行了一个 Nginx 容器,如果是的话,你需要按照这些步骤进行操作。 - deFreitas
4个回答

140

如果您想将变量传递给代理后端,则必须使用代理模块进行设置。

location / {
    proxy_pass                      http://example.com;
    proxy_set_header                Host example.com;
    proxy_set_header                HTTP_Country-Code $geoip_country_code;
    proxy_pass_request_headers      on;
}

现在它已经传递到代理后端。


5
我刚要回复你说它不起作用,因为我已经试过了,但显然它确实有效。我没有正确地查看请求,但是在使用 tcpdump 后,我发现标头一直被传递......谢谢! - Peleg
2
如果客户端设置了它,我只想让该值传递下去。我不知道在我的nginx设置中该值是多少,因此无法重置它。我想要的是任何由客户端创建的自定义标头都可以无变化地传递到反向代理服务器。肯定有一种方法可以实现这一点。 - user1969453
49
请确保在您的服务器块中使用underscores_in_headers on;,否则nginx不会转发这些标头! 参考:http://serverfault.com/a/586997/317502 - kishorer747
@Fleshgrinder,这个方法对301/302重定向也适用吗? - Oleg Belousov
proxy_pass_request_headers on;解决了我的问题 :) - Smilefounder
显示剩余4条评论

72

问题在于 '_' 下划线不是标题属性中的有效字符。 如果不能删除下划线,则可以添加到服务器块中:

underscores_in_headers on;

这基本上是从@kishorer747评论@Fleshgrinder答案中复制并粘贴的,解决方案来自:https://serverfault.com/questions/586970/nginx-is-not-forwarding-a-header-value-when-using-proxy-pass/586997#586997

我把它添加在这里是因为在我的情况下,nginx后面的应用程序完全正常工作,但一旦nginx在我的flask应用程序和客户端之间,我的flask应用程序就不再看到头信息了。 这种调试有点耗时。


7
这正是我在使用 nginx 时遇到的问题,我的搜索也导致我来到了这里。被采纳的答案没有产生任何区别。 - Mark
1
在我的情况下,nginx 忽略了带有下划线(_)的头部信息,这个答案解决了我的问题! - Atul Arvind
1
使用AWS弹性负载均衡器(例如,基于HTTP头部路由流量)的任何人请注意,目前AWS不接受头部中的下划线(_),因此您将无法在ELB端基于这些设置规则。 - Arnaud Bouchot

2

您可以通过添加以下内容来传递所有标头:

ignore_invalid_headers off;

但是请考虑通过这样做可能存在的安全问题。


有趣... nginx认为什么是"无效的头部"?有没有一个列表?更好的是,我们可以添加到列表中吗? - Gwyneth Llewelyn
1
这不是一个列表,请查看文档:“有效的名称由英文字母、数字、连字符和可能的下划线组成(受 underscores_in_headers 指令控制)”https://nginx.org/en/docs/http/ngx_http_core_module.html#ignore_invalid_headers - sekrett
啊,好的 @sekrett — 谢谢你提供的参考! - Gwyneth Llewelyn

0
我正在使用Nginx代理管理器,并且想知道为什么我的请求头没有传递到我的API。添加ignore_invalid_headers off;没有起作用。
添加proxy_pass_request_headers on;对我也没有效果。
我尝试传递一个像这样的头部,但它没有通过Nginx传递:
"User-Id": "17"
我在主机的高级配置中更新了ignore_invalid_headers off;,一切都按预期工作了。

enter image description here

我完全不知道为什么在 Nginx 看来 User-Id 是一个无效的头部。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接