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
但是,我總是得到一個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
。以下是它發生的幾個原因:
favicon.ico.proxy.tv
未在 DNS 中註冊。- 您尚未
resolver
使用有效的 DNS 解析器配置 nginx 指令。