Nginx如何配置让去尾部斜杠规则不生效于/biz路径请求
问题原因
Nginx location 匹配存在明确优先级:正则匹配(带~/~*修饰符)优先级高于普通前缀匹配。你原有的移除尾部斜杠规则属于正则location,会比普通的/biz前缀location先命中,所有带尾部斜杠的/biz路径会先触发301重定向,根本走不到反向代理逻辑。另外301永久重定向会导致绝大多数客户端自动将POST请求转为GET请求,也会直接造成接口请求失败。
解决方案
以下两种方案改动量都很小,任选其一即可:
方案1:给/biz路径添加^~前缀匹配修饰符(推荐,不易出错)
^~是Nginx提供的特殊前缀匹配修饰符,一旦请求命中该前缀规则,Nginx会直接终止后续所有正则location的匹配检查,自然不会触发后面的去斜杠跳转逻辑。
你只需要把原有的/biz代理配置修改为如下形式,原有去斜杠规则不需要做任何调整:
location ^~ /biz { proxy_redirect off; proxy_pass https://localhost:9443; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-Port $server_port; }
所有非/biz开头的路径,依然会正常执行原有的去尾部斜杠逻辑。
方案2:修改去斜杠正则规则,直接排除/biz开头路径
如果你不想调整/biz的location修饰符,可以直接修改原有去斜杠规则的正则表达式,通过负向预查语法排除所有以/biz开头的URI,修改后的去斜杠规则如下:
location ~ ^(?!/biz)(.+)/$ { return 301 $1$is_args$args; }
该正则的逻辑是:仅匹配不以/biz开头、且以/结尾的URI,才执行去斜杠跳转;所有/biz开头的路径不会命中该规则,会正常走到你配置的/biz代理逻辑。
注意事项
- 301属于永久重定向,测试时优先用
curl命令验证结果,避免浏览器缓存旧的301规则导致判断失误 - 如果后续还有其他不需要去斜杠的业务路径,用方案1时直接新增对应
^~前缀的location即可;用方案2时可以在负向预查中追加路径,比如写为^(?!/biz|/other_path)(.+)/$即可同时排除/biz和/other_path两个路径的去斜杠逻辑
内容的提问来源于stack exchange,提问作者marcg
相关产品推荐
相关产品推荐

