![当使用主机变量时,Nginx proxy_pass 并不总是有效](https://linux22.com/image/780621/%E5%BD%93%E4%BD%BF%E7%94%A8%E4%B8%BB%E6%9C%BA%E5%8F%98%E9%87%8F%E6%97%B6%EF%BC%8CNginx%20proxy_pass%20%E5%B9%B6%E4%B8%8D%E6%80%BB%E6%98%AF%E6%9C%89%E6%95%88.png)
我有 2 个带有 proxy_pass 配置的位置块,它们看起来像这样的简化形式:
location ^~ /location1/ {
set $backend1 https://service1.example.com;
proxy_pass $backend1;
}
location ^~ /location2/ {
rewrite /location2/(.*) /new/base/path/$1 break;
set $backend2 https://service2.example.com;
proxy_pass $backend2;
}
现在的问题是,它location1
可以正常工作,但location2
不能,它返回 500,并且我在日志中收到此错误
2022/09/26 18:07:42 [error] 25952#25952: *263 invalid URL prefix in "", client: 123.123.123.123, server: www.example.com, request: "GET /location2/my/url HTTP/1.1", host: "www.example.com", referrer: "https://www.example.com/referrer/page"
如果我使用变量设置值,如下所示:
location ^~ /location2/ {
rewrite /location2/(.*) /new/base/path/$1 break;
proxy_pass https://service2.example.com;
}
然后它就可以正常工作了。不过我需要使用一个变量,因为它有助于强制 nginx 重新解析 DNS(正如该解决方案中提到的)
我从错误日志行中注意到变量$backend2
为空,如果我像这样定义它,它会变得更清楚
set $backend2 service2.example.com;
proxy_pass https://$backend2;
这将输出如下错误:
2022/09/26 18:07:42 [error] 25952#25952: *263 invalid URL prefix in "https://", client: 123.123.123.123, server: www.example.com, request: "GET /location2/my/url HTTP/1.1", host: "www.example.com", referrer: "https://www.example.com/referrer/page"
那么我可能错过了什么?
答案1
我终于找到了这个问题的解决方案,但我在发布之后才意识到这一点。
对我来说,问题在于在位置块中定义变量。在位置块之外定义它足以解决问题。
set $backend2 https://service2.example.com;
location ^~ /location2/ {
rewrite /location2/(.*) /new/base/path/$1 break;
proxy_pass $backend2;
}
但不知道它在其他位置块中是如何工作的。