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。
我在 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。