Apache 的 ServerName 指令不处理 URL 参数,仅定义响应的主机名;拦截查询字符串必须用 mod_rewrite 配合 RewriteCond %{QUERY_STRING} 显式匹配编码后参数,再通过 [F] 或 [R=302,L] 执行拒绝或重定向,且需确保模块启用、引擎开启及 AllowOverride 正确配置。

Apache 的 ServerName 指令本身**不处理 URL 参数(即查询字符串)**,它只定义虚拟主机响应的主机名(如 www.example.com),不涉及 ?key=value 这类内容。所以“在 ServerName 中匹配带问号的参数”这个前提不成立——你无法、也不应该用 ServerName 去做参数拦截。
真正该用 mod_rewrite 拦截 URL 参数
要拦截含特定参数的请求(例如 https://www.example.com/path?token=abc 中的 token=),必须使用 mod_rewrite,并配合 RewriteCond %{QUERY_STRING} 显式检查查询字符串:
-
%{QUERY_STRING}是原始编码值(空格为+,中文为%E4%BD%A0),正则需按此格式写,不能直接写明文 - 必须搭配
RewriteRule使用,且RewriteCond要紧挨着对应规则 - 拦截动作用
[F]返回 403,或[R=302,L]重定向
常见有效配置示例
拒绝所有含 debug=true 或 env=prod 的请求:
RewriteCond %{QUERY_STRING} (debug|env)= [NC]
RewriteRule ^ - [F]
仅拦截 /admin/ 路径下带 cmd= 的请求(防命令注入):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
RewriteCond %{QUERY_STRING} cmd= [NC]
RewriteRule ^/admin/ - [F]
匹配编码后的敏感值,例如拦截 cat%20/etc/passwd:
RewriteCond %{QUERY_STRING} cmd=cat%20%2fetc%2fpasswd [NC]
RewriteRule ^ - [F]
注意作用域与启用条件
规则生效需满足三个前提:
- 主配置中已加载模块:
LoadModule rewrite_module modules/mod_rewrite.so - 虚拟主机或目录配置中开启重写引擎:
RewriteEngine On - 若用
.htaccess,对应目录必须允许覆盖:AllowOverride FileInfo(不能是None)
不要混淆 ServerName 和请求路径匹配
ServerName www.example.com 只决定 Apache 把哪个虚拟主机用于响应 Host: www.example.com 请求;它对 ?xss=alert(1) 完全无感知。参数过滤必须落在请求处理链的后续阶段,也就是 RewriteCond %{QUERY_STRING} 所在的位置。

















