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

时间:2013-01-24 12:09:36

标签: nginx http-headers proxypass

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

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

5 个答案:

答案 0 :(得分:134)

add_headerproxy_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 in his answer相反。

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

add_header X-Upstream $upstream_addr always;

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

答案 1 :(得分:23)

正如奥利弗写道:

  

add_headerproxy_pass同样适用于没有。

然而,正如Shane所写,从Nginx 1.7.5开始,您必须通过always才能让add_header为错误响应工作,如下所示:

add_header  X-Upstream  $upstream_addr always;

答案 2 :(得分:22)

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

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

这将“将服务器输出标头设置为任何状态代码和任何内容类型的自定义值”。它将替换已设置的标头,或者在未设置时添加它们。

答案 3 :(得分:12)

你可以尝试这个解决方案:

使用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;

答案 4 :(得分:3)

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

使用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的组合使您可以设置/替换响应标头值。

可以找到类似的答案here on ServerFault