Nginx location 不支持直接用变量匹配,但可通过 rewrite + 变量、if + return 或 map 预定义映射实现动态跳转;需注意匹配优先于变量求值,避免在 if 中使用 proxy_pass 等指令。

Nginx 的 location 块本身不支持直接使用变量(如 $arg_xxx、$host 等)进行匹配,也就是说,你不能写成 location /$arg_path { ... } 这样的语法。但可以通过其他机制实现“动态跳转”效果——核心思路是:先用静态或正则 location 捕获请求路径,再在内部利用变量(尤其是 rewrite 或 return)做条件判断和重定向。
用 rewrite + 变量实现路径级动态跳转
在匹配到的 location 内,通过 rewrite 指令结合内置变量(如 $arg_*、$http_*、$cookie_*)构造目标 URL:
- 例如,根据查询参数
?to=xxx跳转到对应路径:location /jump {<br> rewrite ^/jump$ $scheme://$host/$arg_to? permanent;<br>} -
$arg_to自动提取?to=/admin中的值,拼成完整跳转地址;末尾的?表示丢弃原始参数,避免重复携带 - 注意:rewrite 中的变量仅在运行时展开,且需确保变量有值,否则可能跳转为空路径(可加
if ($arg_to) { ... }判断)
用 if + return 实现条件跳转(更安全可控)
相比 rewrite,if 块配合 return 更直观、副作用更小(尤其适合简单跳转):
- 示例:当请求头包含特定值时跳转
location /api {<br> if ($http_x_version = "v2") {<br> return 302 https://v2.example.com$request_uri;<br> }<br>} - 支持常见变量:$arg_xxx、$http_xxx、$cookie_xxx、$scheme、$host、$request_uri 等
- ⚠️ 注意:
if在 location 内可用,但不建议在 server 级别滥用;且if内不能嵌套location,只能用return、rewrite、set等有限指令
用 map 指令预定义变量映射(推荐用于多分支跳转)
对于复杂跳转逻辑(比如按域名、参数值映射不同后端),优先用 map 提前定义变量,再在 location 中引用:
- 在 http 块中定义:
map $arg_env $upstream_host {<br> default "dev.example.com";<br> "prod" "prod.example.com";<br> "staging" "staging.example.com";<br>} - 在 location 中使用:
location /proxy {<br> proxy_pass https://$upstream_host$request_uri;<br>} -
map是高效、可读性强的方式,避免大量if嵌套,也规避了if + rewrite的一些已知陷阱
注意事项与避坑提示
动态跳转容易出错,务必注意以下几点:
- location 匹配发生在变量求值之前,所以无法用变量控制匹配行为;所有“动态”都发生在匹配之后
- 不要在
if中使用proxy_pass或root等指令(Nginx 官方明确不推荐) - 跳转目标含变量时,确保变量非空;可用
if ($arg_target != "") { return 302 ...; }加保护 - 调试时开启
error_log /path/to/log notice;,配合log_format打印变量值,验证实际取值是否符合预期









