我知道这个问题已被多次询问,但在尝试了很多解决方案后,我仍然被卡住了。
我正在使用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;
}
答案 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
。了解two
和path
如何连接。
答案 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。您可能需要使用其他浏览器来测试新配置(避免缓存)