You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:24:00