Nginx正则重定向配置问题:不同路径转发至指定IP不生效
两组配置错误原因排查
第一组配置问题
- 正则匹配规则存在逻辑错误:
^/(?:test)/(.*)$要求路径必须是/test/开头(test后强制带斜杠),访问/test(不带尾斜杠)时完全匹配不到规则,最终会落到默认的proxy_pass规则转发到11.11.11.11 - rewrite指令使用了
break参数,只会在当前location内生效,不会终止location匹配流程,转发逻辑本身就存在设计缺陷。
第二组配置问题
- location匹配规则限定过严:
^~ /test/要求路径必须以/test/开头(同样强制尾斜杠),访问/test时匹配不到该规则,会直接走根路径的location转发到11.11.11.11 - 大概率存在浏览器缓存干扰:首次访问根域名后,浏览器会缓存静态资源甚至301跳转规则,后续访问/test时命中缓存,就会继续展示根站点内容,排查时优先避开浏览器缓存验证。
正确可用配置
# 精确匹配根路径,仅访问www.example.com时转发到11.11.11.11 location = / { proxy_pass http://11.11.11.11/; } # 匹配所有/test开头的路径,包含/test、/test/、/test/xxx等所有子路径 location ^~ /test { proxy_pass http://22.22.22.22/; } # 匹配所有/api开头的路径,包含/api、/api/、/api/xxx等所有子路径 location ^~ /api { proxy_pass http://33.33.33.33/; }
配置说明
- 用
location = /做根路径的精确匹配,避免根路径的规则误覆盖子路径 - 去掉
/test和/api匹配规则后的尾斜杠,^~ /test可以命中所有test开头的路径,完全符合需求 - 如果需要把原路径完整传递给后端,比如将
/test/abc转发到http://22.22.22.22/test/abc,只需要删掉proxy_pass地址后的尾斜杠即可,修改为proxy_pass http://22.22.22.22;
验证方法
重载配置后用curl命令测试,完全规避浏览器缓存影响:
# 测试根路径转发 curl -I www.example.com # 测试test路径转发 curl -I www.example.com/test # 测试api路径转发 curl -I www.example.com/api
查看返回的响应头即可判断转发目标是否符合预期。
内容的提问来源于stack exchange,提问作者tchitooss
相关产品推荐
相关产品推荐

