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

sor*_*rin 78 nginx proxypass http-headers

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

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

Oli*_*ver 145

add_header工程,以及与proxy_pass为无.我今天刚刚设置了一个配置,我已经完全使用了该指令.我不得不承认,尽管如此,我还是在努力设置这个问题而没有完全回想起原因.

现在我有一个工作配置,它包含以下(以及其他):

server {
    server_name  .myserver.com
    location / {
        proxy_pass  http://mybackend;
        add_header  X-Upstream  $upstream_addr;
    }
}
Run Code Online (Sandbox Code Playgroud)

在nginx之前,1.7.5 add_header仅对成功的响应起作用,与Sebastian Goodman在他的回答中提到的HttpHeadersMoreModule相反.

从nginx开始1.7.5,always即使在错误响应中也可以使用关键字来包含自定义标头.例如:

add_header X-Upstream $upstream_addr always;
Run Code Online (Sandbox Code Playgroud)

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

  • 从nginx 1.7.5开始,您可以使用"always"在错误响应中包含自定义标头,使用add_header:`add_header X-Upstream $ upstream_addr always;` (40认同)

Seb*_*man 23

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

location ... {
  more_set_headers "Server: my_server";
}
Run Code Online (Sandbox Code Playgroud)

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

  • 您不一定需要一个库才能更改或添加响应标头,与投票最多的答案相反,您可以覆盖标头,您只需先将其删除即可。检查[我下面的答案](/sf/answers/3898464251/)了解详细信息。 (2认同)

Dmi*_*sky 23

正如奥利弗写道:

add_header工程,以及与proxy_pass为无.

但是,正如Shane所写,从Nginx 1.7.5开始,你必须通过always才能开始add_header处理错误响应,如下所示:

add_header  X-Upstream  $upstream_addr always;
Run Code Online (Sandbox Code Playgroud)

  • 我花了很长时间想知道为什么我的标题没有显示,试图在服务器块,位置块中移动它们......这就是原因:nginx不会在错误响应中添加它们:F谢谢 (5认同)

emk*_*a86 13

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

在您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

}
Run Code Online (Sandbox Code Playgroud)

我不确定它是否正是你需要的但是尝试一些这种方法的操作,结果可能适合你的问题.

您也可以使用此组合:

proxy_hide_header headerSetByProxy;
set $sent_http_header_set_by_proxy yourValue;
Run Code Online (Sandbox Code Playgroud)

  • 我必须使用此方法,因为nginx会添加重复的标头,而不是覆盖现有标头。`location / {proxy_pass http://127.0.0.1:8080/; proxy_hide_header“访问控制允许来源”;如果($ http_origin〜*“ ^ https://(example.com | www.example.com)$”){add_header Access-Control-Allow-Origin“ $ http_origin”; }}` (4认同)

Wil*_*ilt 7

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

添加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 *;
Run Code Online (Sandbox Code Playgroud)

因此,proxy_hide_header与结合使用add_header可让您设置/替换响应标头值。

可以在ServerFault上找到类似的答案

更新:

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

  • 您对“proxy_set_header”的评论帮助我理解了两个调用之间的区别,谢谢:) (10认同)
  • 对 add_header 和 proxy_hide_header 的解释对我有帮助。我一直在努力在其中一个回复中看到额外的内容安全政策,这有助于解释为什么会出现这种情况。 (2认同)