在位置块中使用时继承 proxy_set_header

在位置块中使用时继承 proxy_set_header

我正在尝试在 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
        }
    }
}

但是这种方法有一些怪癖。您无法通过这种方式更改ConnectionHost标头,当启用 nginx 自己的缓存并且您正在修改与缓存相关的标头时,您可能需要小心。如果您不关心与缓存相关的标头,那么这些限制出现的最大地方是:1) 使 WebSocket 工作和 2) 以非平凡方式使用标Host头的上游。

因此,我发现一个好的经验法则是对其他所有事物都使用proxy_set_headerforConnectionHostand 。more_set_input_headers

相关内容