我正在使用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;
}
2条答案
按热度按时间kd3sttzy1#
我猜你使用了没有URI的proxy_pass。在这种情况下,nginx传递原始URI,而不是规范化的URI。所以你应该使用
proxy_pass http://backend/;
所以我是对的,只要像这样把URI部分添加到proxy_pass中:
如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
中没有尾部斜杠的示例。如果你访问地址
http://yourserver.com/one/path/here?param=1
,nginx将代理请求到http://127.0.0.1/twopath/here?param=1
。看看two
和path
是如何连接的。lhcgjxsq2#
您可以添加以下行:
例如,我将公共端口80代理到本地端口880
注意:确保重新启动nginx。您可能需要使用另一个浏览器来测试新配置(避免缓存)