apache directory块防盗链通过mod_rewrite限制referer实现,需启用rewrite模块、在directory中配置rewritecond和rewriterule,允许自身域名及空referer,拦截指定静态资源;也可用setenvif+filesmatch替代。

在 Apache 的 Directory 块中配置防盗链,核心是限制非授权来源(Referer)对特定静态资源的直接访问。这种方式比 .htaccess 更高效、更可控,适合有服务器管理权限的场景。
确认 Rewrite 模块已启用
防盗链依赖 mod_rewrite,需确保已加载:
- Ubuntu/Debian:
sudo a2enmod rewrite,再sudo systemctl restart apache2 - CentOS/RHEL:
sudo a2enmod rewrite或检查LoadModule rewrite_module modules/mod_rewrite.so是否在 httpd.conf 中启用 - 重启服务后执行
apache2ctl -t或httpd -t验证语法
在 Directory 块内写入防盗链规则
定位到你要保护的网站目录,例如 /var/www/html,在对应 <directory></directory> 块中添加以下内容:
<directory>
RewriteEngine On
# 允许自身域名(含 www 和无 www)及空 Referer(直接输入 URL 访问)
RewriteCond %{HTTP_REFERER} !^http://(www\.)?yourdomain\.com [NC]
RewriteCond %{HTTP_REFERER} !^https://(www\.)?yourdomain\.com [NC]
RewriteCond %{HTTP_REFERER} !^$
# 拦截常见静态资源(可按需增删扩展名)
RewriteRule \.(jpg|jpeg|png|gif|webp|svg|mp4|webm|pdf|css|js)$ - [F,L]
</directory>
说明:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
[NC]表示不区分大小写;[F]返回 403 Forbidden;[L]表示终止后续规则 -
!^$排除空 Referer,若希望允许直接访问(如用户手动输入图片地址),必须保留此项 - 多个允许域名可叠加
RewriteCond,例如再加一行RewriteCond %{HTTP_REFERER} !^https://trusted-site\.org [NC]
替代方案:用 SetEnvIf + FilesMatch(兼容旧版或需精细控制)
适用于不启用 mod_rewrite 的环境,或想配合 Order/Allow/Deny 使用:
<directory>
# 定义白名单 Referer(支持正则,注意转义点号)
SetEnvIfNoCase Referer "^https?://(www\.)?yourdomain\.com" local_ref
SetEnvIfNoCase Referer "^$" local_ref
# 可选:添加其他可信站点
SetEnvIfNoCase Referer "^https?://cdn\.yourdomain\.com" local_ref
<pre class="brush:php;toolbar:false;"><FilesMatch "\.(jpg|jpeg|png|gif|mp4|pdf)$">
Order Deny,Allow
Deny from all
Allow from env=local_ref
</FilesMatch>
注意:Order Deny,Allow 在 Apache 2.4+ 中已被 Require 替代,若用新版建议改用:
<filesmatch>
Require env local_ref
</filesmatch>
验证与调试要点
配置保存后务必重启 Apache(sudo systemctl restart apache2 或 sudo systemctl restart httpd),再测试:
- 用 curl 模拟不同 Referer:
curl -e "https://badsite.com" -I https://yourdomain.com/image.jpg应返回 403 - 正常访问(带正确 Referer 或空 Referer)应返回 200
- 检查错误日志:
/var/log/apache2/error.log或/var/log/httpd/error_log,排查规则未生效原因 - 确保
AllowOverride None不会覆盖规则——Directory 块中的配置优先级高于 .htaccess










