73

我使用 Nginx 作为代理来过滤对我的应用程序的请求。在“http_geoip_module”的帮助下,我正在创建一个国家代码 http-header,我想使用“headers-more-nginx-module”将它作为请求标头传递。这是 Nginx 配置中的位置块:

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”,但是标题甚至没有传递给响应。

我在这里想念什么?

4

3 回答 3

119

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

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;
}

现在它被传递到代理后端。

于 2013-11-03T09:56:48.423 回答
61

问题是 '_' 下划线在 header 属性中无效。如果删除下划线不是一个选项,您可以添加到服务器块:

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 背后的应用程序工作得非常好,但是一旦 ngix 在我的烧瓶应用程序和客户端之间,我的烧瓶应用程序就不会再看到标题了。调试有点费时。

于 2018-04-06T10:16:55.590 回答
0

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

ignore_invalid_headers off;

但是请通过这样做考虑安全问题。

于 2021-12-27T11:23:35.813 回答