我想为从nginx后面的服务器收到的响应添加一个自定义标头。
虽然add_header
适用于 nginx 处理的响应,但在使用proxy_pass
时它什么都不做。
add_header
也适用于proxy_pass
和没有。我今天刚刚设置了一个配置,我完全使用了该指令。不过,我不得不承认,尽管我也一直在努力设置它,但没有确切地回忆起原因。
现在我有一个工作配置,它包含以下内容(除其他外):
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
来包含自定义标头。例如:
add_header X-Upstream $upstream_addr always;
限制:不能使用 add_header
覆盖server
标头值。
隐藏响应标头,然后添加新的自定义标头值
添加带有 add_header
的标头适用于代理传递,但如果响应中存在现有的标头值,它将堆叠这些值。
如果要设置或替换标头值(例如,替换 Access-Control-Allow-Origin
标头以匹配客户端以允许跨源资源共享),则可以执行以下操作:
# 1. hide the Access-Control-Allow-Origin from the server response
proxy_hide_header Access-Control-Allow-Origin;
# 2. add a new custom header that allows all * origins instead
add_header Access-Control-Allow-Origin *;
因此,proxy_hide_header
与add_header
相结合,使您能够设置/替换响应标头值。
类似的答案可以在ServerFault上找到
更新:
注意:proxy_set_header
用于在进一步发送请求之前设置请求标头,而不是用于设置响应标头(标头的这些配置属性可能有点混乱)。
正如奥利弗所写:
add_header
适用于proxy_pass
和不适用。
但是,正如Shane所写,从Nginx 1.7.5开始,您必须传递always
才能让add_header
处理错误响应,如下所示:
add_header X-Upstream $upstream_addr always;
有一个名为 HttpHeadersMoreModule 的模块,可让您更好地控制标头。它不附带Nginx,需要额外安装。有了它,您可以执行以下操作:
location ... {
more_set_headers "Server: my_server";
}
这将"将服务器输出标头设置为任何状态代码和任何内容类型的自定义值"。它将替换已设置的标头,如果未设置,则会添加它们。
你可以试试这个解决方案:
当您使用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;