我正在尝试在 Nginx 上设置一组虚拟主机,并且我想在将请求传递到上游之前设置一些标头。我有一些始终想要设置的标头,然后还有一些想要为选定位置块设置的标头。
不幸的是,似乎Nginx 不允许proxy_set_header
在多个级别上使用指令,因此,它只会清除 http 块中设置的任何标头。
Nginx 文档声明如下proxy_set_header
:
允许重新定义或附加字段到传递给代理服务器的请求标头。该值可以包含文本、变量及其组合。当且仅当当前级别没有定义 proxy_set_header 指令时,这些指令才会从上一级继承。
所以问题是......要么是 Nginx 有一个令人失望的限制,要么是我以错误的方式思考这个问题。
对于这个问题的惯用解决方案有什么想法吗?
答案1
创建一个文件,将其包含在设置所需标头的每个块中。(因此是通用的 inc-http-headers.conf)将其包含在 http 块和所有需要通用标头的位置块中。
答案2
如果你正在使用OpenResty或者至少是它的headers-more-nginx-module
,你可以用more_set_input_headers
指示。
例如,下面的操作将会实现您所期望的效果:
http {
# ...
more_set_input_headers "Foo: 1";
server {
# ...
more_set_input_headers "Bar: 2";
location / {
more_set_input_headers "Qux: 3";
proxy_pass http://some-server;
# request to some-server has Foo: 1, Bar: 2, and Qux: 3
}
}
}
但是这种方法有一些怪癖。您无法通过这种方式更改Connection
或Host
标头,当启用 nginx 自己的缓存并且您正在修改与缓存相关的标头时,您可能需要小心。如果您不关心与缓存相关的标头,那么这些限制出现的最大地方是:1) 使 WebSocket 工作和 2) 以非平凡方式使用标Host
头的上游。
因此,我发现一个好的经验法则是对其他所有事物都使用proxy_set_header
forConnection
和Host
and 。more_set_input_headers