【问题标题】:Ngnix proxy_pass dosen't work when url contains path当 url 包含路径时,Nginx proxy_pass 不起作用
【发布时间】:2020-09-20 21:52:31
【问题描述】:

我试图从我自己的 FS 中模拟网站。我想拦截任何 http 请求并将其重定向到我的服务器,该服务器将返回所需的文件。 我写了一个简单的默认服务器:

server {
    listen  <<SERVICE_PORT>> default_server;
    server_name _;
    location  / {

        proxy_set_header X-ORIGINAL-URI $request_uri;
        proxy_set_header X-ORIGINAL-REFERRER $http_referer;
        proxy_set_header X-ORIGINAL-HOST $http_host;
        proxy_pass  <<BROWSE_RESOURCE_URL>>/browsing/resource/;
        proxy_redirect off;
    }
}

当输入“http://exapmle.com”这样的网址时,它可以正常工作。但是当任何路径添加为“http://exapmle.com/bar”时,它不会传递到 >/browsing/resource/。目前我收到 404 但不是来自我的服务器。

offcurce 我根本不需要将原始 uri 连接到我的 proxy_pass。

为什么它对我有用?

【问题讨论】:

    标签: nginx reverse-proxy proxypass


    【解决方案1】:

    来自Nginx's documentation

    一个请求 URI 被传递给服务器,如下所示:

    如果 proxy_pass 指令使用 URI 指定,则当请求传递到服务器时,与位置匹配的规范化请求 URI 部分将替换为指令中指定的 URI

    因此,对于您给定的配置,当您请求 http://example.com/bar 时:

    • 规范化的请求 URI 将是 /bar
    • proxy_pass 指令中指定的 URI 将是 /browsing/resource/
    • 将传递给后端服务器的最终 URI 是 /browsing/resource/bar

    您尚未配置后端服务器以了解/browsing/resource/bar。所以它只理解/browsing/resource/。这就是您的后端服务器返回 404 not found 的原因。

    因为您不希望 Nginx 将请求 URI 与 proxy_pass 指令中指定的 URI 结合起来,所以您可以使用 proxy_pass 指令中提到的另一个特性Nginx's documentation:

    当使用 rewrite 指令在代理位置内更改 URI 时,将使用相同的配置来处理请求(中断):

    ...

    在这种情况下,指令中指定的 URI 被忽略,完整的更改的请求 URI 被传递给服务器。

    因此你将指示 Nginx 将所有请求 URI 重写为相同的 URI /browsing/resource/,如下所示:

    location  / {
    
        proxy_set_header X-ORIGINAL-URI $request_uri;
        proxy_set_header X-ORIGINAL-REFERRER $http_referer;
        proxy_set_header X-ORIGINAL-HOST $http_host;
    
        rewrite     ^ /browsing/resource/ break;
        proxy_pass  <<BROWSE_RESOURCE_URL>>;
    
        proxy_redirect off;
    }
    

    【讨论】:

      猜你喜欢
      • 2019-07-14
      • 2015-07-12
      • 2018-02-24
      • 2021-10-15
      • 2019-12-11
      • 1970-01-01
      • 2021-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多