Nginx rewrite不直接提取参数,而是通过正则捕获($1、$2等)提取路径值,或用$arg_XXX变量获取查询参数;复杂场景需set+if或map预处理,删参须显式控制$args或结尾加?。

Nginx 的 rewrite 指令本身不直接“提取参数”,而是通过正则捕获 + 内置变量配合,把 URL 路径中的内容(包括 query string 中的键值)提取出来,再用于重写或后续逻辑。关键点在于:路径部分可直接用 () 捕获,而查询参数(如 ?id=123&type=abc)需借助 $arg_XXX 变量或 set + map 显式获取。
从 URI 路径中提取值(最常用)
正则表达式在 rewrite 的 regex 部分使用 () 捕获组,匹配内容会按顺序存入 $1、$2… 变量:
-
rewrite ^/user/(\d+)/profile$ /api/v1/users/$1?source=nginx last;
访问/user/888/profile→ 提取888到$1,重写为/api/v1/users/888?source=nginx - 支持命名捕获(Nginx 1.11.0+):
rewrite ^/post/(?<id>\d+)$ /article?id=$id permanent;
提取 query string 中的参数值
Nginx 不解析 query string 自动建变量,但提供预定义变量 $arg_参数名(不区分大小写,$arg_ID 和 $arg_id 等效):
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
-
rewrite ^/old$ /new?uid=$arg_id&v=2? last;
访问/old?id=999→ 得到/new?uid=999&v=2(结尾加?可清空原始参数) - 若参数名含特殊字符(如
user-name),用下划线替代:$arg_user_name对应?user-name=xxx
复杂提取:用 set + 正则变量组合构造
当需要对参数做条件判断、截断、拼接等操作时,先用 set 提取并加工,再用于 rewrite:
-
set $new_type "";if ($arg_category ~ "^([a-z]+)-\d+$") { set $new_type $1; }rewrite ^/list$ /catalog?type=$new_type? last; - 注意:
if在 location 中慎用;更健壮的方式是搭配map块预处理(例如将$arg_tag映射为标准化值)
删参或过滤特定参数
rewrite 默认保留原始 query string,要删参必须显式控制 $args 或 $query_string:
- 只保留某几个参数:
rewrite ^(.*)$ $1?uid=$arg_uid&lang=$arg_lang? last; - 完全清除参数:
rewrite ^/clean/(.*)$ /clean/$1? last;(末尾?是关键) - 借助 map 实现白名单过滤(推荐用于多参数场景)

















