我想为nginx后端服务器返回的响应添加自定义头信息。
add_header
可以用于nginx处理的响应,但是在使用proxy_pass
时无效。
我想为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 只能在请求成功时起作用,与HttpHeadersMoreModule不同。这是根据 Sebastian Goodman 的回答。
自从 nginx 版本 1.7.5
版本以后,可以使用关键字 always
来包含自定义头部,即使是错误响应。例如:
add_header X-Upstream $upstream_addr always;
限制:您无法使用add_header
覆盖server
头的值。
add_header X-Upstream $upstream_addr always;
- ShaneX-Upstream: 10.10.10.10
与X-Upstream: 53c2d28edefdf501ab7c92e02a0c1687
(md5可能无法掩盖基础设施,但它传达了这个想法)。 - zamnuts使用 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
用于在请求进一步发送之前设置请求标头,而不是用于设置响应标头(这些标头的配置属性可能有点令人困惑)。
proxy_set_header
的评论帮助我理解了这两个调用之间的差异,谢谢 :) - JonnyRaa正如Oliver所写:
add_header
与proxy_pass
一起使用也能正常工作。
但是,根据Shane的说法,在Nginx 1.7.5及以上版本中,如果想要让add_header
在错误响应中生效,必须传递always
参数,例如:
add_header X-Upstream $upstream_addr always;
有一个名为HttpHeadersMoreModule的模块,它可以让您更多地控制头信息。它不随Nginx一起提供,需要额外安装。使用它,您可以像这样做:
location ... {
more_set_headers "Server: my_server";
}
这将“将服务器输出标头设置为任何状态代码和任何内容类型的自定义值”。它将替换已经设置的标头或在未设置的情况下添加它们。
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;
location / {
proxy_pass http://127.0.0.1:8080/;
proxy_hide_header "Access-Control-Allow-Origin";
if ($http_origin ~* "^https://(example.com|www.example.com)$") {
add_header Access-Control-Allow-Origin "$http_origin";
}
}
- ether6