如何在Nginx中重写单个URL参数且保留其他原有查询参数?
Nginx实现查询参数替换方案
实现思路
- 利用Nginx原生
map指令匹配提取id参数中的合作方标识,无需引入第三方模块 - 支持两种适配模式:内部隐式重写(用户侧地址不变,旧URL可正常访问,符合需求)、301强制跳转新格式
- 自动保留除
id外的所有原有查询参数
具体配置
首先在Nginx全局http配置段中添加map规则:
http { # 提取id参数中的合作方编号,生成对应的rs参数值 map $arg_id $rs_value { default ""; # 匹配id=partnerX格式的参数,提取X部分生成rs=partners_partnerX ~^partner(?<partner_no>\d+)$ partners_partner$partner_no; # 如需新增其他合作方规则,直接在下方添加对应正则匹配行即可 } # 此处保留你原有http段的其他配置,如日志格式、upstream等 server { listen 80; server_name 你的实际域名; root 你的站点根目录; # 参数替换核心逻辑,适配所有路径的请求 if ($arg_id ~ ^partner\d+$) { set $trimmed_query ""; # 移除原查询字符串中的id参数 if ($query_string ~* "(.*)(^|&)id=partner\d+(&.*|$)") { set $trimmed_query $1$3; } # 拼接新的查询字符串,rs参数放在最前,后面接保留的原有参数 set $query_string "rs=$rs_value$trimmed_query"; # 【可选】如果需要用户访问旧链接自动跳转到新格式地址,取消注释下行即可 # return 301 $uri?$query_string; } # 此处保留你原有server段的所有配置,如location规则、反向代理、PHP解析等 location / { try_files $uri $uri/ /index.php$is_args$args; } } }
验证方式
- 配置完成后执行
nginx -t检查语法是否正确 - 语法校验通过后执行
nginx -s reload重载Nginx配置 - 访问测试链接:
- 原地址
你的域名/example?id=partner1&arg1=a&arg2=b,后端将收到rs=partners_partner1&arg1=a&arg2=b参数 - 原地址
你的域名/?id=partner1&arg1=a&arg2=b,后端将收到rs=partners_partner1&arg1=a&arg2=b参数 - 未带
id参数的请求不受任何影响
- 原地址
内容的提问来源于stack exchange,提问作者Василий Старовойтов
相关产品推荐
相关产品推荐

