当位置路径不是 / [关闭] 时,Node.js 应用程序无法加载

当位置路径不是 / [关闭] 时,Node.js 应用程序无法加载

由于某种原因,我在上运行的 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";
        }
}

相关内容