Apache防盗链的核心思路是拒绝非授权来源的资源请求,最常用方式是基于HTTP_REFERER判断来源,配合RewriteCond和RewriteRule拦截或重定向;也可用SetEnvIfNoCase+FilesMatch实现403禁止访问;进阶方案结合动态Cookie校验防伪造。

Apache 防盗链的核心思路是:**拒绝非授权来源的资源请求**,而不是单纯“隐藏地址”。最常用、最可靠的方式是基于 HTTP_REFERER 判断请求来源,配合 RewriteCond 和 RewriteRule 实现拦截或替换。关键不是写得多,而是条件判断准、行为控制稳。
基础防盗链:用 Referer 限制图片等静态资源
适用于防止其他网站直接嵌入你的 .jpg、.png、.gif 等文件。规则需放在网站根目录的 .htaccess 或虚拟主机配置中:
- 先启用重写引擎:
RewriteEngine On - 允许空 Referer(用户直接在浏览器输地址访问):
RewriteCond %{HTTP_REFERER} ^$ - 允许自己域名(支持 www 和无 www):
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?yourdomain\.com/ [NC] - 对匹配的资源类型执行动作:
RewriteRule \.(jpg|jpeg|png|gif|webp|svg|mp4|pdf)$ /images/nolink.png [R,NC,L]
说明:[R] 表示重定向到提示图;/images/nolink.png 必须放在可公开访问的路径下,且不能在被保护目录内;[NC] 忽略大小写;[L] 终止后续规则匹配。
更稳妥写法:用 SetEnvIfNoCase + FilesMatch
比纯 Rewrite 更轻量、更易读,适合批量控制文件类型访问权限:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 定义信任来源:
SetEnvIfNoCase Referer "^https?://(www\.)?yourdomain\.com" local_ref - 也放行空 Referer:
SetEnvIfNoCase Referer "^$" local_ref - 限制特定后缀文件:
<FilesMatch "\.(jpg|jpeg|png|gif|pdf|zip|mp3)$"> - 只允许带标记的请求:
Order Deny,AllowDeny from allAllow from env=local_ref</FilesMatch>
这种方式不触发重定向,直接返回 403 Forbidden,服务器开销更低,且逻辑清晰、不易出错。
进阶防伪造:结合 Cookie 做二次校验
Referer 可被下载工具伪造,加一层 Cookie 验证能显著提升防护强度:
- 在正常页面(如 download.php)中设置可信 Cookie:
setcookie("dl_auth", "valid_20260729", time()+3600, "/"); - 在 .htaccess 中检查该 Cookie:
RewriteCond %{HTTP_COOKIE} !dl_auth=valid_20260729 - 拦截非法请求:
RewriteRule \.(zip|rar|exe|iso)$ - [F,L]
[F] 直接返回 403,比跳转更干净;Cookie 值可动态生成、有时效性,工具难以批量模拟。
调试与避坑要点
写完别急上线,先验证是否生效:
- 用 curl 模拟盗链请求:
curl -H "Referer: https://evil-site.com" https://yoursite.com/photo.jpg,看是否返回 403 或跳转图 - 检查 Apache 错误日志:
tail -f logs/error_log,常见错误如RewriteCond: cannot compile regular expression多因点号未转义(写成\.而非.) - 注意路径上下文:
.htaccess中的模式不带开头斜杠,^photo/(\d+)\.jpg$匹配的是/photo/123.jpg的路径部分photo/123.jpg - 避免无限循环:不要对
nolink.png自身再做防盗链,否则提示图也打不开

















