NGINX:反向代理路径到子域并附加其余部分

NGINX:反向代理路径到子域并附加其余部分

我有以下 NGINX 配置文件:

server {
  server_name devices.example.org;

  ssl_protocols TLSv1.2;
  ssl_certificate /etc/ssl/web/example.crt;
  ssl_certificate_key /etc/ssl/web/example.key;

  location ~* ^/(.*)(.*)?$ {
    proxy_pass                  http://$1.proxy.tv$2;
    proxy_buffering             off;
    proxy_set_header Host       $http_host;
    proxy_set_header X-Real-IP  $remote_addr;
  }

我需要将所有传入的请求代理到显示的后端,即

  • https://devices.example.org/m123应该代理http://m123.proxy.tv
  • https://devices.example.org/m123/favicon.ico应该代理http://m123.proxy.tv/favicon.ico
  • https://devices.example.org/m123/scripts/something.js?params=bar应该代理http://m123.proxy.tv/scripts/something.js?params=bar

然而,我总是得到一个错误的网关错误作为返回,并且在日志中我得到:

[error] 18643#0: *12393 favicon.ico.proxy.tv could not be resolved (3: Host not found)

我认为我的正则表达式以某种方式扭曲了代理请求,但我不确定是如何发生的。

我尝试过的其他组合:

  • location ~* ^/(.*)(?:/(.*))$代理至http://$1.proxy.tv/$2$is_args$args
  • location ~* ^/(.*)(?:/(.*))?代理至http://$1.proxy.tv/$2$is_args$args

任何帮助是极大的赞赏。

答案1

您的location块指令中有两个通配符正则表达式捕获组,这意味着所有内容都被捕获到$1

根据您的要求,以下location块可以起作用:

location ~ ^/(?<subdomain>[^/]+)/(?<path>.*)?$ {
    proxy_pass http://$subdomain.proxy.tv/$path;
    ...
}

为了清楚起见,我<>在正则表达式中使用变量名()。[^/]+用于捕获 URL 路径组件的第一部分(捕获 1 个或多个非 的字符/)。

错误原因Bad Gateway是 nginx 无法解析域名favicon.ico.proxy.tv。以下是导致该错误发生的几个原因:

  1. favicon.ico.proxy.tv未在 DNS 中注册。
  2. 您尚未resolver使用有效的 DNS 解析器配置 nginx 指令。

相关内容