我正在设置 NGINX 服务器,并使用正则表达式创建了一个块,并使用正则表达式捕获的部分添加了 ProxyPass 指令。
我使用 URL http://localhost:8089/first-context/custom-path/test 进行测试。我将 NGINX 的端口 80 公开为 8089。我的 .conf 文件如下:
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
location /first-context/test {
try_files /main.html =404;
}
location ~ /(first-context|second-context)/custom-path/(.*)$ {
# resolver 127.0.0.1; #8.8.8.8
set $context $1;
set $path $2;
set $custom_upstream localhost;
proxy_pass http://localhost:80/${context}/${path};
}
}
如果没有解析器,我会收到不同的错误:
2024/12/19 05:09:00 [错误] 29#29: *1 没有定义解析器来解析本地主机,客户端:172.18.0.1,服务器:本地主机,请求:“GET /first-context/custom-path/测试 HTTP/1.1”,主机:“localhost:8089”
使用解析器指令会失败,并出现如下错误:
2024/12/19 05:07:18 [错误] 29#29:解析时发送()失败(111:连接被拒绝),解析器:127.0.0.1:53
我希望 NGINX 在打开 URL http://localhost:8089/first-context/custom-path/test 时返回 main.html。但我在控制台中收到 502 Bad Gateway,并出现上述错误。
任何人都可以解释为什么解析器不起作用以及如何修复它吗?
因此 NGINX 解析您的
proxy_pass
中的上游地址的方式是通过 DNS。如果你说你的 server_name
是 localhost
,NGINX 将尝试通过 DNS 解析它,如果没有指定 resolver
,它最终会失败。
因此,您需要将解析器设置为常用的 DNS 服务器之一。我通常使用 Google 服务器(
8.8.8.8
或 8.8.4.4
)。当然,这假设您的计算机上没有运行 DNS 服务器,地址为 127.0.0.1
。
那么,就存在NGINX无法识别
URI
中变量的问题。简单来说,它将您的 proxy_pass
到 http://localhost:80/${context}/${path}
视为无效 URI,并且失败。这不是 NGINX 的错误,而只是对 NGINX 如何处理这些场景的误解。您可以设置代理标头,将 URI 更改为 X-Original-URI
+ 您传递的两个变量。
解决方案如下:
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
location /first-context/test {
try_files /main.html =404;
}
location ~ /(first-context|second-context)/custom-path/(.*)$ {
set $context $1;
set $path $2;
proxy_pass http://127.0.0.1:80;
proxy_set_header X-Original-URI /$context/$path;
}
}
我希望这有帮助。