在Apache中配置防盗链(也就是常说的防盗劫持或Hotlink Protection),其实有不少成熟的方案。下面挑几种最常用的方法,从原理到配置一步步拆开来说,相信总有一款适合你的场景。

方法一:mod_rewrite模块——最灵活也最常用
这是Apache自带的重写模块,几乎每个运维人员都会用到。先确认它已经启用:
sudo a2enmod rewrite
sudo systemctl restart apache2
接下来,在网站的.htaccess文件(或者Apache的虚拟主机配置)里插入下面这段规则:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^https://(www.)?yourdomain.com [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .(jpg|jpeg|png|gif)$ - [F,L]
简单解释一下这几行在做什么:
RewriteEngine On——打开重写引擎。RewriteCond %{HTTP_REFERER} !^https://(www.)?yourdomain.com [NC]——检查请求的来源(Referer),如果不是你的域名就直接进入下一轮判断。RewriteCond %{HTTP_REFERER} !^$——同时排除掉Referer为空的情况(比如用户直接输入图片地址,或者某些浏览器/设备发出的请求)。RewriteRule .(jpg|jpeg|png|gif)$ - [F,L]——如果上面两个条件都满足,就返回403 Forbidden,并且停止后续规则处理。
这样,别人想在自己的网站上直接引用你服务器上的图片,就会看到403错误页面,而不是你的图片。当然,你还可以根据需要扩展文件类型,比如加上webp|svg|ico等。
方法二:mod_headers模块——从响应头层面防守
如果不想用重写规则,或者想配合其他安全策略,可以试试用mod_headers。先启用它:
sudo a2enmod headers
sudo systemctl restart apache2
然后在配置文件中添加类似这样的内容:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^https://(www.)?yourdomain.com [NC]
RewriteCond %{HTTP_REFERER} !^$
Header set X-Frame-Options "SAMEORIGIN"
Header set Content-Security-Policy "frame-ancestors 'self'"
这里面有两个关键点:
Header set X-Frame-Options "SAMEORIGIN"——禁止其他网站通过iframe嵌入你的页面。Header set Content-Security-Policy "frame-ancestors 'self'"——进一步限制,只有同源页面才能嵌套你的资源。
当然,这种方法主要防的是“页面被嵌入”,而不是直接防图片被引用。如果你需要更彻底的防盗链,还是建议和方法一配合使用,或者直接用方法一。
方法三:mod_security第三方模块——适合复杂场景
如果网站安全要求比较高,或者需要更精细的规则控制,可以引入mod_security。安装很简单:
sudo apt-get install libapache2-mod-security2
sudo systemctl restart apache2
然后在/etc/modsecurity/modsecurity.conf或对应的配置文件中添加规则:
SecRule REQUEST_FILENAME ".(jpg|jpeg|png|gif)$" "id:1234567,phase:2,deny,status:403,log,msg:'Hotlinking detected'"
这条规则的意思是:匹配请求的文件名,如果是图片类型,就直接拒绝并返回403,同时记录日志。注意这里的id:1234567需要自定义一个唯一编号,避免冲突。相比前两种方法,mod_security能做的事情更多,比如可以结合IP、请求头、甚至用户袋里来做更复杂的判断,但配置成本也相对高一些。
注意事项
最后说几点容易踩坑的地方:
- 防盗链规则一定要小心别误伤到正常用户。比如有些搜索引擎爬虫、社交媒体预览抓图工具,它们的Referer可能为空或者是第三方域名。如果误拦截,会影响网站收录和分享效果。所以很多人会留一个空Referer的例外(就是上面规则里的
!^$条件)。 - 配置不是一成不变的。新的攻击手法、新的图片格式、新的CDN架构,都可能要求你定期检查和更新规则。
- 如果你用的是共享主机,大概率没有权限修改Apache的主配置文件,那只能在
.htaccess里做文章。好在上面两种方法(mod_rewrite和mod_headers)都支持.htaccess,只要主机商启用了对应模块就行。
通过以上几种方式,基本能覆盖大多数Apache防盗链的需求。从最简单的重写规则到更专业的安全模块,按需选择就好。
