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

Pra*_*odi 22 proxy nginx proxypass

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

我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*Ten 30

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

UPDATE

所以我是对的.只需将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/;
    ...
}
Run Code Online (Sandbox Code Playgroud)

nginx文档中所述,如果proxy_pass在没有URI的情况下使用(即在服务器:端口之后没有路径),nginx将完全按原始请求放置URI,与所有双斜杠一样,../依此类推.

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

这是一个尾部斜杠的示例location,但没有斜线斜杠proxy_pass.

location /one/ {
    proxy_pass http://127.0.0.1:8080/two;
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果一个去地址http://yourserver.com/one/path/here?param=1nginx将代理请求http://127.0.0.1/twopath/here?param=1.看看如何twopath连接.