代理传递url中的Nginx尾随斜杠

pqwbnv8z  于 2023-02-21  发布在  Nginx
关注(0)|答案(2)|浏览(269)

我正在使用nginx代理传递到NodeJS应用程序。我正在尝试使URL 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;
}
kd3sttzy

kd3sttzy1#

我猜你使用了没有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的情况下使用(即server:port之后没有路径),nginx将把来自原始请求的URI与所有双斜线、../等完全相同。
另一方面,proxy_pass中的URI的作用类似于alias指令,表示nginx将替换与位置前缀匹配的部分(在我们的示例中,第一个位置是/a,第二个位置是/a/),proxy_pass指令中有URI(我有意使其与location prefix相同),因此URI将与请求的URI相同,但规范化了(没有双斜线和所有的工作人员)。小心与尾随斜线。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是如何连接的。

lhcgjxsq

lhcgjxsq2#

您可以添加以下行:

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。您可能需要使用另一个浏览器来测试新配置(避免缓存)

相关问题