You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache 2.4.12(Windows)下拦截含大量空格的格式错误URL并返回404而非403的方法

Apache 2.4.12(Windows)下拦截含大量空格的格式错误URL并返回404而非403的方法

兄弟我太懂你这糟心的情况了——早年网站遗留的bug导致URL里带一堆空格,浏览器能自动处理没人发现,结果现在爬虫死咬着这些错URL爬,Apache还直接先返回403,自己写的.htaccess规则根本没机会生效,日志里的报错看了就头疼!

问题根源

你之前用<If>块匹配REQUEST_URI的思路没问题,但为什么没生效?因为Apache在请求处理的极早期阶段,就检测到URL格式非法(包含大量转义后的空格%20),直接触发了403 Forbidden,这时候.htaccess里的规则还没轮到执行呢。而且Windows环境下的Apache,URL解析逻辑还会有一点点特殊,雪上加霜。

靠谱解决方案:用RewriteEngine匹配原始请求

关键是要绕开Apache解析后的URI,直接匹配客户端发送的原始请求字符串——也就是THE_REQUEST变量,它存储的是客户端发过来的完整请求行(比如GET /%20%20%20%20/assets/ProductPhotos/image.png HTTP/1.1),不会被Apache提前修改或拦截。

把你原来的规则替换成下面的内容(放到.htaccess/ht.conf里):

RewriteEngine On

# 匹配URL中包含连续2个及以上转义空格(%20)的请求,直接返回404
RewriteCond %{THE_REQUEST} %20{2,} [NC]
RewriteRule ^ - [R=404,L]

如果想更精准地匹配你说的“/后面跟着一堆空格再跟/”的情况,可以把RewriteCond改成:

RewriteCond %{THE_REQUEST} \s/%20{2,}/\s [NC]

要是想告诉爬虫“这资源永久没了别再来了”,把R=404改成R=410就行:

RewriteRule ^ - [R=410,L]

为什么这个方法能生效?

THE_REQUEST是Apache最早能获取到的原始请求数据,RewriteEngine的规则会在Apache触发核心错误(403)之前执行,所以能抢先拦截这些非法URL,返回你想要的状态码。

万一还是不行?试试这个兜底方案

如果上面的Rewrite规则还是没效果,可能需要先让Apache允许这些编码空格的请求进入规则处理阶段。你需要在vhost配置里添加一行:

AllowEncodedCharacters %20

不过这个操作需要重启Apache,你要是不想动生产环境,可以先在测试vhost里验证效果。

测试方法

用curl或者浏览器访问带大量空格的URL,比如:

http://webtest.xxx/          /assets/f22.jpg

看响应头是不是返回404(或410),而不是之前的403就说明成功了。

备注:内容来源于stack exchange,提问作者AristotleO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 09:57:46