使用Nginx反向代理时Node Express收到的URL出现双前导斜杠如何解决
双斜杠问题产生原因
该问题由Nginx的proxy_pass路径替换逻辑直接导致:
当location /test匹配到请求URI时,你配置的proxy_pass http://localhost:3030/;末尾携带了斜杠,属于带URI的代理配置,Nginx会将请求URI中匹配到的/test前缀替换为proxy_pass指定的/。
你访问http://server/test/banana时,请求URI里/test后的剩余部分是/banana,替换拼接后最终传给上游Node服务的路径就是/ + /banana = //banana。merge_slashes指令仅作用于Nginx接收的原始用户请求的斜杠合并,不会处理proxy_pass拼接生成的路径,因此修改该配置无效。
解决方案
你可以根据业务需求二选一:
方案1:移除
proxy_pass末尾的斜杠,适配路径前缀透传
修改Nginx配置如下:location /test { proxy_pass http://localhost:3030; proxy_http_version 1.1; proxy_set_header Host $host; }该配置下,访问
http://server/test/banana时,上游Node服务接收到的路径为/test/banana,你需要同步调整Express路由,添加/test前缀即可。方案2:调整location匹配规则,保留原有Express路由
修改Nginx配置如下:# 兼容不带末尾斜杠的/test访问 rewrite ^/test$ /test/ permanent; location /test/ { proxy_pass http://localhost:3030/; proxy_http_version 1.1; proxy_set_header Host $host; }该配置下,访问
http://server/test/banana时,Nginx会将匹配到的/test/前缀替换为/,上游接收到的路径就是/banana,无需修改现有Node代码即可正常匹配路由。
内容的提问来源于stack exchange,提问作者Brian Mac
相关产品推荐
相关产品推荐

