.htaccess防盗链配置:允许指定爬虫、豁免目录且不硬编码自身域名
现有规则的问题说明
你写的规则存在3个核心问题:
- 逻辑运算符误用:所有否定判断的
RewriteCond使用[OR]拼接会导致逻辑永真。!A [OR] !B等价于!(A && B),只要不同时满足A和B就会触发,完全不符合「仅允许指定来源」的需求,应该把除最后一个条件外的所有[OR]删掉,使用默认的AND逻辑。 - 开放目录规则写反:你需要
/cross-origin-resources/目录下的图片不拦截,原规则的[OR]会导致这个判断完全失效。 - 你提到的倒数第二行报错属于测试工具的兼容问题:测试工具对
%{HTTP_HOST}@@%{HTTP_REFERER}拼接后的反向引用匹配校验存在局限性,实际Apache环境下这个写法本身合法,不属于语法错误。
修正后的可用配置
RewriteEngine On # 标记所有图片请求 RewriteRule \.(bmp|gif|jpe?g|png|webp)$ - [NC,E=CHECK_IMAGE:1] # 直接放行开放目录下的所有请求 RewriteCond %{REQUEST_URI} ^/cross-origin-resources/ [NC] RewriteRule .* - [L] # 同时满足以下所有条件时拦截图片请求 RewriteCond %{ENV:CHECK_IMAGE} =1 # 不是本站来源 RewriteCond %{HTTP_HOST}@@%{HTTP_REFERER} !^([^@]*)@@https?://\1/.* [NC] # 不是空Referer RewriteCond %{HTTP_REFERER} !^$ # 不在允许的爬虫来源列表中 RewriteCond %{HTTP_REFERER} !^https?://(www\.)?bing\..+$ [NC] RewriteCond %{HTTP_REFERER} !^https?://(www\.)?facebook\..+$ [NC] RewriteCond %{HTTP_REFERER} !^https?://(www\.)?google\..+$ [NC] RewriteCond %{HTTP_REFERER} !^https?://(www\.)?instagram\..+$ [NC] RewriteCond %{HTTP_REFERER} !^https?://(www\.)?linkedin\..+$ [NC] RewriteCond %{HTTP_REFERER} !^https?://(www\.)?reddit\..+$ [NC] RewriteCond %{HTTP_REFERER} !^https?://(www\.)?twitter\..+$ [NC] # 返回403拦截 RewriteRule .* - [F,L]
规则匹配逻辑说明
修正后的规则完全匹配你的4项需求:
- 仅允许列表内的指定爬虫来源抓取图片,其余跨域图片请求全部拦截
/cross-origin-resources/目录下的所有资源无限制直接放行- 本站内的图片加载请求来源为自身域名,会直接跳过拦截规则,不影响访客正常浏览
- 全程通过
HTTP_HOST动态匹配当前站点域名,没有硬编码站点信息,可直接移植到其他站点使用
内容的提问来源于stack exchange,提问作者Vince
相关产品推荐
相关产品推荐

