当使用主机变量时,Nginx proxy_pass 并不总是有效

当使用主机变量时,Nginx proxy_pass 并不总是有效

我有 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;
}

但不知道它在其他位置块中是如何工作的。

相关内容