如何添加在 nginx 上的响应头时使用代理_pass?

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

虽然 add_header适用于 nginx 处理的响应,但是在使用 proxy_pass时它什么也不做。

222705 次浏览

你可以试试这个办法:

在你的 location块中,当你使用 proxy_pass的时候,这样做:

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;

有一个称为 HttpHeadersMoreModule的模块,它使您能够更好地控制标题。它不附带 Nginx,需要额外的安装。有了它,你可以做这样的事情:

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

这将“为任何状态代码和任何内容类型将 Server 输出头设置为自定义值”。它将替换已经设置的标头,如果未设置,则添加它们。

add_headerproxy_pass一样工作良好。我今天刚刚设置了一个配置,其中我使用了完全相同的指令。我不得不承认,虽然我没有准确地回忆起原因,但是我也努力地建立了这个网站。

现在我有一个工作配置,它包含以下内容(其中之一) :

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

在 nginx1.7.5之前,Add _ header只对成功的反应起作用,这与 塞巴斯蒂安 · 古德曼的回答提到的 HttpHeadersMoreModule不同。

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

add_header X-Upstream $upstream_addr always;

限制: 不能使用 add_header覆盖 server头值。

正如奥利弗所写:

add_headerproxy_pass一样工作良好。

然而,正如 Shane 所写,在 Nginx1.7.5中,必须传递 always才能让 add_header为错误响应工作,如下所示:

add_header  X-Upstream  $upstream_addr always;

隐藏响应头,然后添加一个新的自定义头值

使用 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_headeradd_header的结合赋予了您设置/替换响应头值的能力。

类似的答案可以找到 这里是 ServerFault

更新:

注意: proxy_set_header用于在请求进一步发送之前设置请求头,而不是用于设置响应头(这些头的配置属性可能有点混乱)。