在 nginx 中配置带参数的 url 转发,核心做法是在 location 块中使用 rewrite 指令配合正则表达式捕获组,将匹配到的路径和参数重新映射到目标地址。具体而言,通过 (.*) 捕获原始路径,并在替换字符串中引用 $1,同时利用 $args 变量自动附加原有的查询参数,从而实现透明转发。若需保留原参数,直接拼接 $args;若需丢弃或修改参数,则显式指定新的查询串。

如何保留原有查询参数进行路径重写
当需要将请求从旧路径转发到新路径且必须保留所有原始查询参数时,应在 rewrite 的替换字符串末尾追加 $args 变量。Nginx 默认不会自动附加查询参数到重写后的 URL,除非使用 last 或 break 标志且未显式清空参数,但最稳妥的方式是显式拼接。例如,将 /old/path 下的所有请求转发到 /new/path,并携带如 ?id=123 的参数,配置如下:
server {
listen 80;
server_name example.com;
location /old/ {
rewrite ^/old/(.*)$ /new/$1$args last;
}
}
上述配置中,^/old/(.*)$ 匹配以 /old/ 开头的路径,$1 代表捕获的子串,$args 包含完整的查询字符串(不含 ?)。使用 last 标志表示重写后重新发起内部请求,确保新路径被正确路由。测试时访问 /old/test?id=456,实际处理的是 /new/test?id=456,参数完整保留。
如何丢弃特定参数并重定向到固定 URL
若需忽略原始请求中的查询参数,并将请求重定向到一个不带参数的固定 URL,应使用 redirect 或 permanent 标志,并在替换字符串中省略 $args。这种方式适用于清理无效参数或将用户引导至标准化页面。例如,将所有带参数的 /search 请求重定向到首页 /home,且不保留任何参数:
server {
listen 80;
server_name example.com;
location /search {
rewrite ^/search(.*)$ /home redirect;
}
}
此处 ^/search(.*)$ 匹配 /search 及其后续路径,替换为 /home 后触发客户端重定向(HTTP 302)。由于未引用 $args,原始参数如 ?q=test 将被丢弃。浏览器收到响应后会向 /home 发起新请求,URL 中不再包含查询字符串。此方法适合用于废弃旧接口或统一入口场景。
基于 $args 变量为空时的条件判断如何处理
当请求不包含任何查询参数时,$args 变量的值为空字符串,此时若仍执行带 $args 的重写,可能导致路径拼接异常或产生多余斜杠。因此,在处理可能无参数的请求时,应先判断 $args 是否为空,再决定重写策略。例如,仅当存在参数时才进行路径转换,否则返回 400 错误:
server {
listen 80;
server_name example.com;
location /api/data {
if ($args = "") {
return 400 "Missing parameters";
}
rewrite ^/api/data/(.*)$ /processed/$1$args last;
}
}
该配置中,if ($args = "") 检查查询字符串是否为空。若为空,立即返回 400 状态码,阻止后续重写逻辑执行。若不为空,则继续执行 rewrite,将请求转发至 /processed/ 路径并附带参数。这种条件判断确保了只有合法请求才被处理,避免了对无参请求的错误转发。注意 if 在 Nginx 中需谨慎使用,因其行为不同于常规编程语言的 if 语句,仅用于简单条件分支。











