我有以下 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
。以下是导致该错误发生的几个原因:
favicon.ico.proxy.tv
未在 DNS 中注册。- 您尚未
resolver
使用有效的 DNS 解析器配置 nginx 指令。