NginX在代理传递URL中尾随斜杠

时间:2014-03-31 10:34:11

标签: nginx proxy proxypass

我知道这个问题已被多次询问,但在尝试了很多解决方案后,我仍然被卡住了。

我正在使用NginX代理传递给NodeJs应用程序。我正在尝试让网址https://example.com代理将请求传递给http://example.com:8080/?

请求(来自移动应用)请求https://example.com// nginx正在使http://example.com:8080//?无效。

我尝试过但没有奏效的事情:

  • merge_slashes on;(默认情况下已启用)
  • rewrite ^/(.*)/$ /$1 permanent;
  • port_in_redirect off;

我的nginx配置:

location = /a {
    proxy_pass http://127.0.0.1:8080;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_read_timeout 300;
}

location ^~ /a/ {
    proxy_pass http://127.0.0.1:8080;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_read_timeout 300;
}

2 个答案:

答案 0 :(得分:20)

我猜你使用没有URI的proxy_pass。在那种情况下,nginx按原样传递原始URI,而不是规范化的URI。所以你应该使用proxy_pass http://backend/;

<强>更新

所以我是对的。只需将URI部分添加到proxy_pass,如下所示:

location = /a {
    proxy_pass http://127.0.0.1:8080/a;
    ...
}

location ^~ /a/ {
    proxy_pass http://127.0.0.1:8080/a/;
    ...
}

nginx documentation中所述,如果proxy_pass没有使用URI(即没有服务器:端口之后的路径),nginx会将原始请求中的URI与所有双斜杠完全相同,../等等。

另一方面,proxy_pass中的URI就像alias指令一样,意味着nginx会替换匹配位置前缀的部分(在第一个位置它是/a的情况并且/a/是第二个)在proxy_pass指令中使用URI(我故意使其与位置前缀相同),因此URI将与请求的相同但标准化(没有doule斜杠和所有工作人员)。 小心,带有斜杠。 Nginx从字面上替换部分,你可能会得到一些奇怪的网址。

以下是location中尾部斜杠的示例,但proxy_pass中没有斜线斜杠。

location /one/ {
    proxy_pass http://127.0.0.1:8080/two;
    ...
}

如果转到地址http://yourserver.com/one/path/here?param=1,nginx会将请求代理到http://127.0.0.1/twopath/here?param=1。了解twopath如何连接。

答案 1 :(得分:0)

您可以添加以下行:

proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

例如,我将公共端口80代理到本地端口880

location / {
            proxy_redirect off;
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_connect_timeout 90;
            proxy_send_timeout 90;
            proxy_read_timeout 90;
            proxy_buffer_size 16k;
            proxy_buffers 32 8k;
            proxy_busy_buffers_size 64k;

            proxy_pass   http://127.0.0.1:880/;
    }

注意:确保重新启动Nginx。您可能需要使用其他浏览器来测试新配置(避免缓存)