apache无“rewritefilter”模块,实际使用mod_rewrite配合rewritecond %{query_string}和rewriterule实现url参数过滤;需启用模块、允许重写、开启引擎,并用编码后形式精准匹配敏感参数,结合路径限制与白名单防误杀。

Apache 本身没有叫 “RewriteFilter” 的模块——这是常见误解。实际可用的是 mod_rewrite 模块,配合 RewriteCond + RewriteRule 实现对 URL 请求参数(即查询字符串,?key=value 部分)的检测与拦截。所谓“过滤非法参数”,本质是:当请求中出现敏感参数名或值时,直接返回 403 禁止访问。
确认 mod_rewrite 已启用并允许规则生效
这是前提,否则所有规则都不起作用:
- 检查
httpd.conf或虚拟主机配置中已开启模块:LoadModule rewrite_module modules/mod_rewrite.so(取消前面的 #) - 若使用
.htaccess,必须确保对应目录的配置允许重写:AllowOverride FileInfo(不能是None) - 在规则文件开头加上:
RewriteEngine on
正确匹配查询字符串中的敏感参数
RewriteRule 默认只匹配路径(如 /admin.php),不解析 ? 后面的内容。必须用 RewriteCond %{QUERY_STRING} 显式检查:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 错误写法(完全无效):
RewriteRule ^/admin\.php\?token=.* - [F] - 正确写法(匹配任意路径下含
token=的请求):RewriteCond %{QUERY_STRING} token= [NC]<br>RewriteRule ^ - [F] -
%{QUERY_STRING}是原始编码值(如空格为+,中文为%E4%BD%A0),正则需按编码后形式写,例如匹配cmd=cat%20/etc/passwd要写cmd=cat%20%2fetc%2fpasswd
精准控制拦截范围,避免误杀
全局过滤风险高,建议限定路径或组合条件:
- 只拦截
/api/下带debug=true的请求:RewriteCond %{QUERY_STRING} debug=true [NC]<br>RewriteRule ^/api/ - [F] - 同时要求多个参数存在(如
token且env):RewriteCond %{QUERY_STRING} token=<br>RewriteCond %{QUERY_STRING} env= [NC]<br>RewriteRule ^ - [F] - 排除白名单路径(如健康检查接口):
RewriteCond %{REQUEST_URI} !^/healthz放在条件链最前
应对常见绕过手段
攻击者常对敏感词做编码或变形,需针对性覆盖:
- 匹配 base64 编码特征(如
cmd=Y2F0):RewriteCond %{QUERY_STRING} cmd=[a-zA-Z0-9+/]{20,} [NC] - 匹配 hex 编码(如
cmd=%63%61%74):RewriteCond %{QUERY_STRING} cmd=%[0-9a-fA-F]{2} [NC] - 忽略大小写、支持多值分隔(如
param=abc¶m=exec):
用[NC]和更宽松的正则,如(cmd|exec|phpinfo|passwd)









