如何禁止指定后缀文件盗链,仅放行apple-touch开头的PNG文件?
解决防盗链规则失效问题:放行apple-touch开头PNG,拦截其他指定文件
我来帮你梳理下现有规则的问题,并且给出能正常生效的修正方案。
现有规则的核心问题
你的规则失效主要有三个原因:
- 第一个重写规则没有加
[L]标志,导致匹配到apple-touch开头的PNG后,后续的防盗链规则依然会执行,引发逻辑冲突; - 防盗链规则没有覆盖重写后的
appicon.png,如果有人直接请求或盗链这个文件,会被错误拦截; - 缺少对空Referer的放行,可能误拦截用户直接访问资源的合法请求。
修正后的完整规则
# 处理Apple Icons重写,匹配后立即停止后续规则执行 RewriteRule ^/?apple-touch.*\.png$ applicon.png [L] # HOTLINKING PREVENTION 核心配置 # 放行两类文件:原始apple-touch开头的PNG、重写后的appicon.png RewriteCond %{REQUEST_URI} !^/?(apple-touch.*\.png|applicon\.png)$ [NC] # 放行空Referer(用户直接输入URL访问资源的场景) RewriteCond %{HTTP_REFERER} !^$ # 放行自身域名下的请求(兼容http/https、带/不带www的情况) RewriteCond %{HTTP_REFERER} !^https?://(www\.)?mydomain.com/ [NC] # 拦截指定后缀的盗链请求,返回403 Forbidden RewriteRule \.(jpg|jpeg|png|gif|css|js)$ - [NC,F,L]
关键规则细节说明
[L]标志的作用:给第一个重写规则加上[L]后,只要请求匹配apple-touch开头的PNG,就会立即完成重写并停止后续所有规则的处理,直接返回资源,从根源上避免被防盗链规则拦截。- 放行重写后的文件:在防盗链的排除条件里加入
applicon\.png,确保即使有人直接请求这个重写后的文件,也不会被误拦截。 - 空Referer放行:很多浏览器在用户直接输入URL访问资源时,不会发送Referer头,加上
RewriteCond %{HTTP_REFERER} !^$可以放行这类合法请求,避免影响正常访问。 - 域名匹配优化:给域名正则加上结尾的
/,比如mydomain.com/,可以防止恶意域名通过mydomain.com.evil.com这种形式绕过检查。
验证场景
- ✅ 访问
yourdomain.com/apple-touch-icon.png:正常重写为appicon.png并返回 - ✅ 其他域名盗链
yourdomain.com/apple-touch-icon.png:正常返回(符合放行要求) - ❌ 其他域名盗链
yourdomain.com/style.css:返回403 Forbidden - ✅ 直接访问
yourdomain.com/appicon.png:正常返回
内容的提问来源于stack exchange,提问作者Maris
相关产品推荐
相关产品推荐

