Nginx Ngnix proxy_pass dosen';url包含路径时无法工作

Nginx Ngnix proxy_pass dosen';url包含路径时无法工作,nginx,reverse-proxy,proxypass,Nginx,Reverse Proxy,Proxypass,我试图从我自己的FS模拟网站。我想截获任何http请求并将其重定向到我的服务器,该服务器将返回所需的文件。 我编写了一个简单的默认服务器: server { listen <<SERVICE_PORT>> default_server; server_name _; location / { proxy_set_header X-ORIGINAL-URI $request_uri; proxy_set_head

我试图从我自己的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;
    }
}
服务器{
监听默认的\u服务器;
服务器名称;
地点/{
代理集头X-ORIGINAL-URI$request\u URI;
代理集标题X-ORIGINAL-referer$http\u referer;
代理设置头X-ORIGINAL-HOST$http\U主机;
代理通行证/浏览/资源/;
代理_重定向关闭;
}
}
当url被设置为“时”http://exapmle.com“它工作得很好。但当任何路径被添加为“http://exapmle.com/bar“它不会传递到/browsing/resource/。目前我接收404,但不是从我的服务器

实际上,我根本不需要将原始uri与我的代理传递相关联

为什么它对我有用?

来自:

请求URI按如下方式传递到服务器:

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;
}
如果proxy_pass指令是用URI指定的,那么当请求被传递到服务器时,与位置匹配的规范化请求URI部分将被该指令中指定的URI替换

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

  • 规范化的请求URI将是
    /bar
  • proxy\u pass指令中指定的URI将是
    /browsing/resource/
  • 将传递到后端服务器的最终URI是
    /browsing/resource/bar
您尚未将后端服务器配置为理解
/browsing/resource/bar
。所以它只理解
/browsing/resource/
。这就是为什么您的后端服务器返回404未找到

由于您不希望Nginx将请求URI与proxy_-pass指令中指定的URI组合在一起,因此可以使用proxy_-pass指令的另一个功能,如中所述:

使用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;
}
位置/{
代理集头X-ORIGINAL-URI$request\u URI;
代理集标题X-ORIGINAL-referer$http\u referer;
代理设置头X-ORIGINAL-HOST$http\U主机;
重写^/浏览/资源/中断;
代用通行证;
代理_重定向关闭;
}