如果主机是可变的,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;
}
我正在尝试使用变量在 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;
}