在Apache服务器上实施防盗链(防盗版)虽然是一个老生常谈的话题,但每次遇到具体场景,总有人踩坑。今天我们将系统梳理几种常见方法,核心思路始终是限制非法来源的资源访问。当然,需要提醒的是,没有任何方案能保证100%安全,但只要做到让绝大多数盗链者绕道而行,就已经足够。

- 方法一:HTTP Referer验证——最基础也最常用
原理基于HTTP Referer头,它记录了请求的来源页面。你可以在Apache配置文件(如httpd.conf或apache2.conf)中,利用或指令,限制仅允许来自信任域名的请求。例如,以下配置仅放行来自example.com的请求:
Order deny,allow
Deny from all
Allow from env=referer_from_example_com
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^https://(www.)?example.com [NC]
RewriteRule .* - [F,L]
该配置通过RewriteCond检查Referer是否匹配,若不匹配则直接返回403状态码。需要注意的是,Referer头可被伪造,因此此方法仅能防御简单的盗链行为,无法应对刻意伪装的攻击者。
- 方法二:Token验证——更灵活但也更麻烦
为每个受保护资源生成唯一的Token,并将其附加到URL参数或HTTP头部发送。服务器端接收到请求后,先验证Token的有效性,通过后方可放行。配置示例如下:
Order deny,allow
Deny from all
Allow from env=valid_token
RewriteEngine On
RewriteCond %{QUERY_STRING} !token=YOUR_UNIQUE_TOKEN [NC]
RewriteRule .* - [F,L]
Token验证的优势在于Token可动态生成并定期过期,伪造难度远高于Referer。但缺点也很明显:你需要自行维护Token的生成与校验逻辑,后端程序必须配合实现。
- 方法三:mod_rewrite模块——一力降十会
Apache的mod_rewrite模块本身就是一个万能工具,防盗链仅是它众多绝活之一。你可以将前面的Referer检查与Token检查组合在一起,甚至加入IP段、User-Agent等自定义条件,灵活配置。综合示例:
RewriteEngine On
# 检查Referer
RewriteCond %{HTTP_REFERER} !^https://(www.)?example.com [NC]
RewriteRule .* - [F,L]
# 检查Token
RewriteCond %{QUERY_STRING} !token=YOUR_UNIQUE_TOKEN [NC]
RewriteRule .* - [F,L]
上述两条规则为“或”关系——只要Referer或Token任一不匹配,即被拦截。你可以根据业务需求将逻辑调整为“与”或“或”。
最后想说一句心里话:上面这些方法均基于HTTP协议层面的限制,而HTTP头部可被程序化修改。如果对方铁了心要盗取你的资源,通过爬虫伪造头部、逐条破解Token,总能找到缝隙。真正可靠的做法是在后端实施更严格的身份验证(如登录态+短时效签名),或者干脆将关键资源以动态输出形式呈现。不过话说回来,对于大多数普通网站,Referer与Token的组合已经能过滤掉99%的盗链行为。
