如何通过Nginx剔除URL中的无用参数,仅保留指定合法参数
Nginx 剔除URL多余无用参数配置方案
方案一:原生Nginx map方案(无额外模块依赖,推荐)
该方案利用Nginx的map指令提前过滤参数,性能损耗极低,适合绝大多数场景:
- 首先在
http配置块中定义参数过滤规则:
http { # 配置过滤规则,仅保留good参数 map $args $filtered_args { default ""; # 递归匹配所有good参数,自动拼接多值参数 ~(^|&)(good=[^&]*) $2&$filtered_args; } server { listen 80; server_name example.com; root /var/www/example; location / { # 仅当参数发生变化时才重定向,避免死循环 if ($args != $filtered_args) { # 调试阶段可将permanent改为redirect使用302临时重定向 rewrite ^ $uri?$filtered_args? permanent; } # 原有业务配置,例如静态资源、反向代理规则等 try_files $uri $uri/ =404; } } }
- 规则调整说明:
- 如需新增保留参数,例如需要同时保留
uid、page参数,只需在map块中新增对应匹配规则即可:map $args $filtered_args { default ""; ~(^|&)(good=[^&]*) $2&$filtered_args; ~(^|&)(uid=[^&]*) $2&$filtered_args; ~(^|&)(page=[^&]*) $2&$filtered_args; } rewrite规则末尾的?作用是禁止Nginx自动拼接原始$args,确保仅返回过滤后的参数
方案二:Lua扩展方案(适合复杂参数规则场景)
如果服务已经安装了ngx_http_lua_module模块,可使用Lua脚本处理参数,适配更复杂的过滤逻辑,对多值参数的处理更稳定:
location / { set_by_lua $filtered_args ' local args = ngx.req.get_uri_args() local res = {} for key, val in pairs(args) do -- 仅保留good参数 if key == "good" then if type(val) == "table" then -- 处理同名多值参数 for _, v in ipairs(val) do table.insert(res, "good=" .. ngx.escape_uri(v)) end else table.insert(res, "good=" .. ngx.escape_uri(val)) end end end return table.concat(res, "&") '; if ($args != $filtered_args) { rewrite ^ $uri?$filtered_args? permanent; } # 原有业务配置 }
验证方法
配置修改后执行nginx -t校验配置无误,执行nginx -s reload重载配置,访问测试地址http://example.com/?good=1&bad1=something&bad2=something&bad2=something&good=2,会自动重定向到http://example.com/?good=1&good=2符合需求。
内容的提问来源于stack exchange,提问作者Weblloyd
相关产品推荐
相关产品推荐

