Apache Directory 块中防盗链如何配

作者:袖梨 2026-08-07

Apache Directory块防盗链通过mod_rewrite限制Referer实现,需启用rewrite模块、在Directory中配置RewriteCond和RewriteRule,允许自身域名及空Referer,拦截指定静态资源;也可用SetEnvIf+FilesMatch替代。

在 Apache 的 Directory 块中配置防盗链,核心是限制非授权来源(Referer)对特定静态资源的直接访问。这种方式比 .htaccess 更高效、更可控,适合有服务器管理权限的场景。

确认 Rewrite 模块已启用

防盗链依赖 mod_rewrite,需确保已加载:

  1. Ubuntu/Debian:sudo a2enmod rewrite,再 sudo systemctl restart apache2
  2. CentOS/RHEL:sudo a2enmod rewrite 或检查 LoadModule rewrite_module modules/mod_rewrite.so 是否在 httpd.conf 中启用
  3. 重启服务后执行 apache2ctl -thttpd -t 验证语法

在 Directory 块内写入防盗链规则

定位到你要保护的 目录,例如 /var/www/html,在对应 <Directory> 块中添加以下内容:

<Directory "/var/www/html">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>

说明:

  1. [NC] 表示不区分大小写;[F] 返回 403 Forbidden;[L] 表示终止后续规则
  2. !^$ 排除空 Referer,若希望允许直接访问(如用户手动输入图片地址),必须保留此项
  3. 多个允许域名可叠加 RewriteCond,例如再加一行 RewriteCond %{HTTP_REFERER} !^https://trusted-site.org [NC]

替代方案:用 SetEnvIf + FilesMatch(兼容旧版或需精细控制)

适用于不启用 mod_rewrite 的环境,或想配合 Order/Allow/Deny 使用:

<Directory "/var/www/html"># 定义白名单 Referer(支持正则,注意转义点号)SetEnvIfNoCase Referer "^https?://(www.)?yourdomain.com" local_refSetEnvIfNoCase Referer "^$" local_ref# 可选:添加其他可信站点SetEnvIfNoCase Referer "^https?://cdn.yourdomain.com" local_ref
&lt;FilesMatch ".(jpg|jpeg|png|gif|mp4|pdf)$"&gt;Order Deny,AllowDeny from allAllow from env=local_ref&lt;/FilesMatch&gt;

</Directory>

注意:Order Deny,Allow 在 Apache 2.4+ 中已被 Require 替代,若用新版建议改用:

<FilesMatch ".(jpg|jpeg|png|gif)$">Require env local_ref</FilesMatch>

验证与调试要点

配置保存后务必重启 Apache(sudo systemctl restart apache2sudo systemctl restart httpd),再测试:

  1. 用 curl 模拟不同 Referer:curl -e "https://badsite.com" -I https://yourdomain.com/image.jpg 应返回 403
  2. 正常访问(带正确 Referer 或空 Referer)应返回 200
  3. 检查错误日志:/var/log/apache2/error.log/var/log/httpd/error_log,排查规则未生效原因
  4. 确保 AllowOverride None 不会覆盖规则——Directory 块中的配置优先级高于 .htaccess

相关文章

精彩推荐