如何在使用proxy_pass时在nginx上添加响应头?

我想为从nginx后面的服务器收到的响应添加一个自定义头。

虽然add_header适用于nginx处理的响应,但是在使用proxy_pass时它不执行任何操作。

有一个名为HttpHeadersMoreModule的模块,可以让您更好地控制标题。 它不是与Nginx一起来的,需要额外的安装。 有了它,你可以做这样的事情:

 location ... { more_set_headers "Server: my_server"; } 

这将“将服务器输出标题设置为任何状态码和任何内容types的自定义值”。 它将replace已经设置的标题,或者如果未设置,添加它们。

add_headerproxy_pass一样工作,没有。 我今天刚刚设置了一个configuration,我已经准确地使用了这个指令。 不过,我不得不承认,尽pipe如此,我也没有完全回想起这个原因。

现在我有一个工作的configuration,它包含以下(其中包括):

 server { server_name .myserver.com location / { proxy_pass http://mybackend; add_header X-Upstream $upstream_addr; } } 

在nginx 1.7.5之前, add_header只在成功的响应上工作,与Sebastian Goodman在他的回答中提到的HttpHeadersMoreModule相反。

自nginx 1.7.5 always ,即使在错误响应中,您也可以使用关键字always来包含自定义头文件。 例如:

 add_header X-Upstream $upstream_addr always; 

限制:您无法使用add_header覆盖server标头值。

正如奥利弗写道:

add_headerproxy_pass一样工作,没有。

但是,正如Shane写的,从Nginx 1.7.5开始,你必须always传递,以便让add_header工作来处理错误响应,如下所示:

 add_header X-Upstream $upstream_addr always; 

你可以试试这个解决scheme:

在你使用proxy_pass时你的location块做这样的事情:

 location ... { add_header yourHeaderName yourValue; proxy_pass xxxx://xxx_my_proxy_addr_xxx; # Now use this solution: proxy_ignore_headers yourHeaderName // but set by proxy # Or if above didn't work maybe this: proxy_hide_header yourHeaderName // but set by proxy } 

我不确定它是否正是你所需要的,但尝试一些这种方法的操纵,也许结果将适合你的问题。

你也可以使用这个组合:

 proxy_hide_header headerSetByProxy; set $sent_http_header_set_by_proxy yourValue;