【问题标题】:Nginx - Infinite reload when adding variable in proxy_passNginx - 在proxy_pass中添加变量时无限重新加载
【发布时间】:2020-01-29 11:51:06
【问题描述】:

我在 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 中的变量替换了端口,但正如我向您展示的那样,当我在那里添加任何变量时就会发生这种情况。

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

【问题讨论】:

标签: loops docker nginx static reload


【解决方案1】:

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

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

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

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

例如:

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

详情请见this document


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

例如:

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

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

【讨论】:

  • 您好,感谢您的回答。这适用于我在那里使用的示例变量 $test 。但是如果我想用变量替换端口,比如“$port”而不是“18080”,那么问题将是一样的。我仍然找不到为每个用户代理端口的方法。我认为 proxy_pass 仅仅通过添加一个变量来改变它的行为是非常奇怪的......
猜你喜欢
  • 2017-07-07
  • 2020-09-16
  • 2013-06-04
  • 1970-01-01
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多