nginx rewrite中变量直接以$形式嵌入指令,$host用于域名分流,$uri匹配解码路径,$args处理查询参数,$request_method限制请求方法,$http_user_agent识别客户端;参数提取需用$request_uri或正则配合$arges,组合变量可构造新url;注意$uri已解码、if不嵌套、last/break行为差异及变量不可用于location匹配。

在 Nginx rewrite 中使用全局变量和请求参数,核心是理解变量的来源、作用范围和拼接逻辑。它们不是“调用函数”,而是直接以 $变量名 的形式嵌入到 rewrite 指令或 if 条件中,配合正则捕获和字符串组合完成路径重写或跳转控制。
常用全局变量怎么用
这些变量由 Nginx 自动填充,无需定义,直接引用即可:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
-
$host:匹配访问的域名,适合多站点分流。例如把 www.example.com 的请求统一跳转到主站:
if ($host = "www.example.com") {
rewrite ^/(.*)$ https://example.com/$1 permanent;
} -
$uri:当前解码后的路径(不含参数),常用于路径重写。比如把 /blog/xxx 映射为 PHP 路由:
rewrite ^/blog/(.*)$ /index.php?path=$1 last; -
$args:原始查询字符串(不带 ?),可原样保留或条件判断。例如强制移除某个参数:
if ($args ~* "utm_source=") {
rewrite ^(.*)$ $1? permanent;
} -
$request_method:限制非法请求方法,如禁止 POST 访问静态资源:
if ($request_method = POST) {
return 405;
} -
$http_user_agent:识别爬虫或旧浏览器,做定向拦截或降级:
if ($http_user_agent ~* "Baiduspider|YisouSpider") {
return 403;
}
请求参数怎么提取和重组
URL 中的参数(如 ?id=123&lang=zh)不会自动进入 $uri,但可通过 $args 获取完整串,也可用正则从 $request_uri 中精确提取:
- 用 $request_uri 匹配带参原始 URI(如
/user?id=123&v=2),适合需要保留或改写特定参数的场景:
rewrite ^/user\?id=(\d+)(?:&|$) /profile/$1? permanent;
注意结尾的?表示丢弃其余参数;不加则自动追加原 $args。 - 用 if + $args 做条件判断,再重写整条路径:
if ($args ~* "debug=true") {
rewrite ^/api/(.*)$ /debug-api/$1 break;
} - 组合多个变量构造新 URL,比如加时间戳防缓存:
set $new_args "$args&t=$time_iso8601";
rewrite ^/static/(.*)$ /static/$1?$new_args break;
注意事项和常见坑
rewrite 中变量使用看似简单,但几个细节容易出错:
- $uri 是解码后的路径,所以
/file%2Fname.txt会被变成/file/name.txt;若需原始编码,必须用$request_uri。 - 在 if 块中使用 rewrite,Nginx 会先执行 if 再处理 rewrite,但 if 不支持嵌套,复杂逻辑建议用 map 指令预处理。
- 变量不能直接用于 location 匹配,location 只认字面路径或正则,$host、$args 等只能在内部 rewrite 或 return 中使用。
- last 和 break 的行为差异直接影响后续匹配:last 会重新走 location 查找,break 则立即终止当前块内所有 rewrite —— 这关系到 root、alias 是否生效。
- 所有变量在 rewrite 执行时才求值,因此可以安全引用 set 定义的自定义变量,但不能在正则 pattern 部分使用变量(Nginx 不支持变量插值正则)。










