如何使用 nginx 代理传递位置 / 之后的所有地址?

如何使用 nginx 代理传递位置 / 之后的所有地址?

我正在运行一个名为的 node.js 应用程序服务在网页上显示我的计算机特定路径的文件和文件夹:

在此处输入图片描述

nginx此应用程序本身运行良好,尝试访问文件夹时未看到任何错误消息。但是,当我尝试在位置 上运行它时/page/,我无法查看任何文件或文件夹的内容,并且404 Not Found如果我尝试访问它们,我会收到错误。我正在使用以下nginx.conf文件:

events {}

http {
    server {

        listen 80;
        server_name 127.0.0.1;

        location /page/ {
             proxy_pass http://localhost:8070/;
        }

    }
}

我看到的错误消息如下:

在此处输入图片描述

显然,当我尝试访问文件夹时,页面被重定向到localhost/a而不是。我在这里错过了什么?我是否需要使用不同的结构将所有内容从在特定端口上运行的应用程序重定向到特定位置(例如)?localhost/page/aa/page

答案1

您可以尝试访问http://127.0.0.1在浏览器中查看是否有效?server_name 指令按原样匹配 HTTP 主机标头,不依赖于 DNS 解析。如果有效,并且您想要使用http://本地主机,请将 server_name 指令更改为 localhost 而不是 127.0.0.1

答案2

[表达方式 ”服务器重定向在 HTTP 上下文中通常表示“服务器发送 30x 响应“,所以你的问题可能有点误导。]

问题似乎不是nginx, 但服务:被代理的应用程序必须知道如何正确生成 HTML 链接。特别是它必须知道:

  • 代理服务器的主机名和端口是什么。这通常可以在标头中传达Forward

    proxy_set_header Forwarded $proxy_add_forwarded;
    
  • 应用程序的路径是什么。这通常可以在应用程序中配置。

在你的情况下服务可能使用绝对 URI,即使它没有部署在网站的根目录下。您可以通过指示nginx修改返回的页面:

location /page/ {
    sub_filter 'href="/' 'href="/page/';
    sub_filter 'src="/' 'src="/page/';
    proxy_pass http://localhost:8070/;
    proxy_redirect http://localhost:8070/ http://$server_name/page/
}

但是,不能保证这些表达式会重写所有 URL。

评论:server_name您的配置中应为域名,而非 IP 地址。请localhost改为输入。

相关内容