Nginx

NGINX:反向代理路徑到子域並附加其餘部分

  • March 5, 2022

我有以下 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

但是,我總是得到一個Bad Gateway錯誤作為回報,並且在我得到的日誌中:

[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

任何幫助是極大的讚賞。

您的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 指令。

引用自:https://serverfault.com/questions/1095162