乐闻世界logo
搜索文章和话题

Nginx 如何在代理请求时添加响应头?

6 个月前提问
3 个月前修改
浏览次数185

6个答案

1
2
3
4
5
6

在 Nginx 中,当我们作为代理向后端服务器转发请求时,有时候我们需要在响应头中添加一些自定义的头信息。这可以通过使用 add_header 指令来完成,该指令通常在 serverlocation 块中指定。

以下是 Nginx 配置文件中添加自定义响应头的一个例子:

nginx
server { listen 80; server_name example.com; location / { proxy_pass http://backend_server; # 此处是你的后端服务器地址 add_header X-Proxy-Cache $upstream_cache_status; # 其他代理设置,例如设置代理头信息等 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }

在上面的配置中,我们为所有通过 / location 块代理的请求添加了一个名为 X-Proxy-Cache 的自定义响应头。该头的值设置为 $upstream_cache_status 变量的值,这个变量通常用来表示后端服务器的缓存状态。

需要注意的是,add_header 指令不仅可以添加常量值的头,还可以添加由 Nginx 变量动态生成的值。然而,如果使用了 add_header 指令,你需要确保复制所有默认的头信息,因为 add_header 指令会覆盖 Nginx 的默认行为,只输出你在配置中明确指定的头。

上述配置仅是一个简单的例子,你可以根据实际需要添加其他的响应头或者进行更复杂的配置。

2024年6月29日 12:07 回复

add_header无论有没有,效果都一样好proxy_pass。我今天刚刚设置了一个配置,我在其中使用了该指令。但我必须承认,我在设置这个过程时也遇到了困难,但没有确切地回忆起原因。

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

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

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

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

shell
add_header X-Upstream $upstream_addr always;

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

2024年6月29日 12:07 回复

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

添加标头add_header可以很好地使用代理传递,但如果响应中存在现有标头值,它将堆叠这些值。

如果您想设置或替换标头值(例如替换Access-Control-Allow-Origin标头以匹配您的客户端以允许跨源资源共享),那么您可以执行以下操作:

shell
# 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用于在进一步发送请求之前设置请求标头,而不是用于设置响应标头(标头的这些配置属性可能有点令人困惑)。

2024年6月29日 12:07 回复

正如奥利弗所写:

add_header无论有没有,效果都一样好proxy_pass

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

shell
add_header X-Upstream $upstream_addr always;
2024年6月29日 12:07 回复

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

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

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

2024年6月29日 12:07 回复

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

在您的location块中,当您使用时,proxy_pass请执行以下操作:

shell
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 }

我不确定这是否正是您所需要的,但尝试对此方法进行一些操作,也许结果会适合您的问题。

您也可以使用此组合:

shell
proxy_hide_header headerSetByProxy; set $sent_http_header_set_by_proxy yourValue;
2024年6月29日 12:07 回复

你的答案