Nginx - 在 proxy_pass 中添加变量时无限重新加载

Nginx - Infinite reload when adding variable in proxy_pass

我在 Docker 上使用 Nginx,我想为每个用户分配不同的端口。

首先,没有添加任何东西,我的代码工作正常:

    location  /viewer/ {
        proxy_pass http://xx.xxx.xxx.xxx:18080/Road/;
    }

转到 URL 中的“/viewer/”将代理到端口 18080,正如预期的那样。

但是如果我向 proxy_pass 添加任何变量,例如:

set $test 1;
proxy_pass http://xx.xxx.xxx.xxx:18080/Road/?$test;

然后,首先,静态文件不再加载,我必须添加如下行:

    location ~ \.css {
       add_header  Content-Type    text/css;
    }
    location ~ \.js {
       add_header  Content-Type    application/x-javascript;
    }

在此之后,静态文件再次工作,但页面开始无限重新加载。

之前我认为这是因为我用 proxy_pass 中的变量替换了端口,但正如我向您展示的那样,当我在那里添加任何变量时就会发生这种情况。

你认为我做错了什么? 感谢您的帮助!

proxy_pass 添加一个变量会改变它的行为。您将需要构建整个 URI。

在您的原始配置中,URI /viewer/foo 在向上游传递之前被转换为 /Road/foo

在您的新配置中,URI /viewer/foo 被转换为 /Road/?1 并且原始 URI 的尾部丢失。

使用 rewrite...break 修改 URI 可能会更成功。

例如:

location  /viewer/ {
    rewrite ^/viewer(.*)$ /road?something break;
    proxy_pass http://xx.xxx.xxx.xxx:18080;
}

详情见this document


根据您的评论,您希望更改目标端口。

例如:

location  /viewer/ {
    rewrite ^/viewer(.*)$ /road break;
    proxy_pass http://xx.xxx.xxx.xxx:$myport;
}

如果您通过 IP 地址指定上游服务器,则不需要 resolver 语句。但是如果你通过名称指定上游,你将需要定义一个resolver。有关详细信息,请参阅 this document