Nginx使用变量后location前缀匹配失效如何解决?
问题根源
当proxy_pass指令的值包含变量时,Nginx不会自动执行前缀路径的截取替换逻辑。你原来的无变量配置中proxy_pass http://www.example.com/;尾部带斜杠,访问/bbb/abc时Nginx会自动将匹配到的/bbb/前缀替换为/,最终代理到/abc。改用变量后该逻辑失效,完整的请求路径/bbb/abc会直接拼接到代理地址后,最终请求上游的路径为//bbb/abc,因此返回404。
解决方案
以下两种配置均可在保留resolver和变量的前提下实现原有代理逻辑:
方案1:rewrite路径重写(推荐,兼容原前缀匹配逻辑)
server { location /bbb/ { resolver 127.0.0.11 valid=30s; set $example www.example.com; rewrite ^/bbb/(.*)$ /$1 break; proxy_pass http://$example; } }
说明:rewrite指令会将/bbb/开头的路径前缀去掉,break参数确保重写后的路径直接在当前location块内完成代理,不会触发外部跳转,proxy_pass尾部不需要额外加斜杠。
方案2:正则location捕获路径
server { location ~ ^/bbb/(.*)$ { resolver 127.0.0.11 valid=30s; set $example www.example.com; proxy_pass http://$example/$1$is_args$args; } }
说明:通过正则直接捕获/bbb/后的路径片段到$1变量,直接拼接到上游地址后,$is_args$args会自动携带原请求的查询参数,避免参数丢失。
注意事项
- 原配置中
set $example www.example.com尾部缺少分号,需要补充否则会报配置语法错误 resolver的valid参数需要填写实际的缓存有效时间,例如30s、5m,不能使用some secs这类占位字符
内容的提问来源于stack exchange,提问作者axel
相关产品推荐
相关产品推荐

