由于某种原因,我在上运行的 Node.js 应用程序127.0.0.1:8081
需要/
。
如果我从这个开始,两者都/
能够/projectb
加载页面。
server {
listen 80;
location / {
proxy_pass http://127.0.0.1:8081;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location /projectb {
proxy_pass http://127.0.0.1:8081/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
当我将其更改为此时,/projectb
无法完全加载页面。当我查看网络选项卡时,一些(但不是所有的)请求失败,例如某些图像、.js、一些错误的端点。
server {
listen 80;
location /somethingelse {
proxy_pass http://127.0.0.1:8080/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location /projectb { # I'd expect this to still work.
proxy_pass http://127.0.0.1:8081/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
总而言之,当我直接访问端口时123.456.78.910:8081
,以及当我同时拥有/
和/projectb
代理时,它都可以工作,但是当我单独http://127.0.0.1:8081/
代理到时,它就不起作用。/projectb
为什么会出现这种情况?
答案1
从nginx 文档在proxy_pass
:
如果该
proxy_pass
指令以 URI 指定,则当请求传递到服务器时,与位置匹配的规范化请求 URI 的部分将被该指令中指定的 URI 替换:location /name/ { proxy_pass http://127.0.0.1/remote/; }
如果
proxy_pass
指定了但没有指定 URI,则在处理原始请求时,请求 URI 会以客户端发送的相同形式传递给服务器,或者在处理更改后的 URI 时传递完整的规范化请求 URI:location /some/path/ { proxy_pass http://127.0.0.1; }
在您的 2 个示例中,后者提供了一个 URI(/
以 URL 结尾),这使得 URI 被规范化,这将导致 js/css 文件中的相对链接中断。删除/
:
server {
listen 80;
location /somethingelse {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location /projectb {
proxy_pass http://127.0.0.1:8081;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}