.htaccess中%{REQUEST_URI}规则失效,无法拦截特定请求排查
问题描述
某WordPress站点遭多个IP地址的机器人攻击,攻击者频繁访问URL:https://example.com/product/something/#comment-1804,但该站点不存在此评论,疑似低级别DOS攻击。为减少资源与带宽消耗,尝试通过以下.htaccess规则拦截该URL并返回403页面:
RewriteEngine On RewriteCond %{REQUEST_URI} comment-1804 RewriteRule ^ - [F] [END] </IfModule>
站点已配置WordPress默认规则,但上述拦截规则未生效。不过故意写错规则(如写成%{REQUEST_URI}comment-1804)会导致站点崩溃,说明规则已被服务器读取,请问问题出在哪里?
问题原因及解决办法
- 核心原因:URL中的
#comment-1804属于锚点(Fragment),这部分内容仅在浏览器端解析,不会随请求发送到服务器。服务器实际接收到的请求URI只有/product/something/,因此你的RewriteCond规则永远无法匹配到comment-1804。 - 可行解决方向:
- 针对恶意IP拦截:既然机器人来自多个IP,可通过服务器防火墙(如iptables、ufw)或CDN/WAF工具,批量封禁攻击IP段,直接阻断恶意请求;
- 利用CDN/WAF的锚点拦截:部分CDN或Web应用防火墙支持基于完整URL(包括锚点)的规则配置,可在这类工具中设置拦截包含
#comment-1804的请求; - 修正规则(若锚点是误判):如果攻击者实际是在URL路径中而非锚点携带
comment-1804,需调整.htaccess规则:- 确保拦截规则放在WordPress默认重写规则之前,避免被WordPress的规则提前处理;
- 使用更严谨的正则匹配语法:
注:<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI} comment-1804 [NC] RewriteRule ^ - [F,L] </IfModule>[END]在部分旧版Apache中兼容性较差,替换为[L]更稳妥;[NC]表示忽略大小写,扩大匹配范围。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

