如果主机是可变的,nginx proxy_pass 与新 URI 不起作用

nginx proxy_pass with new URI does not work if host is varaible

我正在尝试使用变量在 proxy_pass 中设置主机名,但是一旦我尝试这样做,该位置之后的路径将被忽略。

如果我尝试获取 localhost:8001/dirA/x/y/z.html。以下 returns 来自 http://server1:8888/dirB/dirC/x/y/z.html 的文件。这是我期望发生的事情。

        location ^~ /dirA/ {
            proxy_pass http://server1:8888/dirB/dirC/;

但是如果我尝试以下配置,它只是使用主机名变量...并尝试获取 localhost:8001/dirA/x/y/z.html

        location ^~ /dirA/ {
            set $endpoint server1;
            proxy_pass http://$endpoint:8888/dirB/dirC/;

我得到 http://server1:8888/dirB/dirC/index.html 而不是返回。

这就是 proxy_pass 的工作原理。如果在值中使用变量,则需要提供整个 URI。详情见this document

您可以使用正则表达式 location。例如:

location ~ ^/dirA/(.*)$ {
    set $endpoint server1;
    proxy_pass http://$endpoint:8888/dirB/dirC/;
}

请注意,正则表达式位置的顺序很重要。有关详细信息,请参阅 this document


或者,rewrite...break 也应该有效。

location ^~ /dirA/ {
    set $endpoint server1;
    rewrite ^/dirA/(.*)$ /dirB/dirC/ break;
    proxy_pass http://$endpoint:8888;
}