虚拟主机环境下配置ModSecurity实现站点级WAF过滤,核心是通过.htaccess启用SecRuleEngine On并结合Host匹配限定作用域;若不支持,则改用cPanel预置规则、应用层插件或CDN防火墙替代。
虚拟主机环境下配置 mod_security 实现站点级 waf 规则过滤,核心在于将规则作用域精准限制在目标域名或目录,避免全局生效影响其他站点。由于共享虚拟主机通常不开放 apache 主配置(httpd.conf)修改权限,实际可行路径依赖于服务器是否支持 .htaccess 启用 mod_security,以及是否启用 secruleengine on 的局部控制能力。
确认虚拟主机是否支持 mod_security 局部配置
多数托管型虚拟主机(如 cPanel 共享主机)默认禁用 mod_security 的用户级控制,或仅提供预设的“开启/关闭”开关(如 ModSecurity™ Configurator),不支持自定义规则。需先通过以下方式验证:
- 创建一个
.htaccess文件,写入SecRule ARGS "test" "id:100,deny,status:403"并访问带?test=1的 URL,观察是否返回 403; - 查看主机商文档是否明确说明支持
SecRule、SecRuleEngine等指令在.htaccess中使用; - 联系技术支持,确认是否启用
AllowOverride SecFilter或类似权限(Apache 2.4+ 对应SecRuleEngine需AllowOverride All或显式授权)。
在支持的虚拟主机中启用站点专属规则
若确认支持,可在目标站点根目录的 .htaccess 中配置,实现“仅对该域名/子目录生效”的规则:
- 开头添加
SecRuleEngine On(确保本目录规则启用); - 使用
SecRule REQUEST_HEADERS:Host "example\.com" "id:101,phase:1,pass,nolog,tag:'site-specific'"做域名匹配前置条件; - 后续规则加上
chain或用ctl:ruleRemoveById配合条件判断,例如只对/wp-admin/路径拦截恶意 POST:
SecRule REQUEST_HEADERS:Host "example\.com" "id:102,phase:1,pass,nolog,chain"
SecRule REQUEST_URI "^/wp-admin/" "chain"
SecRule REQUEST_METHOD "POST" "id:103,deny,status:403,msg:'Blocked admin POST'绕过共享主机限制的替代方案
当 .htaccess 不被允许加载 mod_security 指令时,可考虑以下务实做法:
- 利用主机面板(如 cPanel → ModSecurity Tools)为该域名单独启用预置规则集(如 OWASP CRS),虽无法自定义 ID,但能实现基础防护;
- 在应用层(如 WordPress)使用插件(Wordfence、Sucuri)模拟 WAF 行为,通过 PHP 解析请求并拦截,规则作用域天然限于当前站点;
- 若使用 Cloudflare 等 CDN,直接在其防火墙规则中为该子域名设置自定义 WAF 规则(如匹配 User-Agent 或 SQL 关键字),无需依赖服务器 mod_security。
注意事项与常见失效原因
即使配置语法正确,规则也可能不生效,关键检查点包括:
- mod_security 版本:2.x 与 3.x 规则语法差异大(如 3.x 必须用
SecRuleEngine On,2.x 可用SecFilter); - 规则阶段(phase)错误:URL 解析在 phase:1,GET 参数在 phase:2,POST body 在 phase:2 或 phase:4(需
SecRequestBodyAccess On); - Apache 版本兼容性:
.htaccess中 mod_security 指令在 Apache 2.4.7+ 才较稳定支持,旧版本常静默忽略; - 规则 ID 冲突:避免使用 1–99 等系统保留 ID,自定义规则建议从 1000 起始。










