121

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

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

4

5 回答 5

202

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;

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

于 2013-04-30T21:07:31.310 回答
37

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

使用代理传递添加标头可以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用于在进一步发送请求之前设置请求标头,而不是用于设置响应标头(标头的这些配置属性可能有点混乱)。

于 2019-04-15T15:17:58.300 回答
36

有一个名为HttpHeadersMoreModule的模块可以让您更好地控制标头。它不附带 Nginx,需要额外安装。有了它,您可以执行以下操作:

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

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

于 2013-01-24T18:22:08.970 回答
33

正如奥利弗所写:

add_header无论有proxy_pass没有都可以正常工作。

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

add_header  X-Upstream  $upstream_addr always;
于 2016-05-31T19:33:11.470 回答
17

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

当您使用时,在您的locationproxy_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;
于 2013-01-24T17:31:25.010 回答