我有 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;
}
但不知道它在其他位置块中是如何工作的。