Apache mod_evasive在Drupal虚拟主机特定页面不遵循配置问题
解决Drupal 9 PHP状态页面触发mod_evasive 403的问题
问题分析
你在虚拟主机配置的mod_evasive规则对大部分页面生效,但/admin/reports/status/php每次刷新都返回403,说明这个页面的请求触发了mod_evasive的默认阈值,而非你自定义的规则。大概率是该页面的请求处理被Apache的其他配置段覆盖,或者页面本身的加载行为导致请求计数异常。
解决方案
1. 针对PHP状态页面单独配置mod_evasive
在你的虚拟主机配置文件中,添加针对该页面的<Location>块,强制应用自定义规则:
<Location "/admin/reports/status/php"> <IfModule mod_evasive20.c> DOSSiteCount 50 DOSSiteInterval 1 DOSPageCount 10 DOSPageInterval 1 DOSBlockingPeriod 120 </IfModule> </Location>
添加后重启Apache服务,测试页面是否正常访问。
2. 检查冲突的配置段
查看Apache的全局配置或Drupal根目录的.htaccess文件,确认是否存在针对/admin路径的单独<Directory>或<Location>配置——这类配置可能重置了mod_evasive的参数。如果有,修改这些配置段使其继承虚拟主机的mod_evasive规则,或者直接删除冲突的重置项。
3. 启用mod_evasive日志排查原因
如果上面的方法无效,开启mod_evasive的日志功能,明确触发403的具体原因:
在虚拟主机的mod_evasive配置块中添加日志目录配置:
<IfModule mod_evasive20.c> DOSSiteCount 50 DOSSiteInterval 1 DOSPageCount 10 DOSPageInterval 1 DOSBlockingPeriod 120 DOSLogDir "/var/log/apache2/mod_evasive" </IfModule>
确保日志目录存在且Apache有写入权限,重启服务后访问PHP状态页面,查看日志文件就能知道是DOSPageCount还是DOSSiteCount触发了拦截,再针对性调整参数。
4. 临时放宽该页面的规则(可选)
如果日志显示页面的请求计数确实超标,可以临时给这个页面设置更宽松的参数:
<Location "/admin/reports/status/php"> <IfModule mod_evasive20.c> DOSPageCount 20 DOSPageInterval 2 </IfModule> </Location>
内容的提问来源于stack exchange,提问作者NKP
相关产品推荐
相关产品推荐

