盗链是指其他网站直接将您的图像或文件URL嵌入到他们的页面中。每次访客加载那个页面时,您的服务器都会传输该文件,消耗您的带宽,但不会为您带来任何流量。在共享主机上,这会迅速耗尽您的带宽配额,甚至导致您的账户被暂停。
什么是盗链?为什么这是个问题?
假设您的图像在 https://yourdomain.com/img/product.jpg,而另一个网站使用 <img src="https://yourdomain.com/img/product.jpg">。那个外部网站的每位访客都会导致您的服务器发送该文件——您支付带宽费用,而他们却受益于您的资源。
后果包括:
- 带宽消耗速度比预期更快——可能产生超额费用
- 服务器负载增加,减慢您自己网站的速度
- 共享主机上带宽超过配额时,账户被暂停的风险
- 受版权保护的文件未经许可被使用
方法1:通过DirectAdmin GUI启用
DirectAdmin包含内置的防盗链功能,您无需手动编辑 .htaccess 即可启用:
- 登录到DirectAdmin → 点击 Advanced Features(高级功能)
- 选择 Hotlink Protection(防盗链保护)
- 切换 Enable Hotlink Protection(启用防盗链保护)为开启
- 输入 Allowed URLs(允许的URL)——允许链接您的文件的域名(包括您自己的域名)
- 输入 Allowed Extensions(允许的扩展名)——要保护的文件类型,例如
jpg,jpeg,png,gif,webp,pdf,mp3,mp4 - 设置 Redirect URL(重定向URL)——要显示的"禁止盗链"图像
- 点击 Save(保存)
DirectAdmin会自动为您写入相应的 .htaccess 规则。
方法2:手动配置.htaccess
为了获得更精细的控制,或者您的主机缺少GUI选项,请将以下内容添加到您的 .htaccess 文件(位于 public_html/ ):
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?yourdomain\.com/ [NC]
RewriteRule \.(jpg|jpeg|png|gif|webp|svg|pdf|mp3|mp4)$ - [F,NC,L]
每个条件的工作方式:
!^$——允许直接访问(无引用者),这样在浏览器中输入URL仍然有效!^https?://(www\.)?yourdomain\.com/——允许来自您自己域的请求[F]——返回403禁止响应,而不是提供文件
保存前用您实际的域名替换 yourdomain.com。要允许多个域,为每个域添加额外的 RewriteCond 行。
理解盗链造成的带宽损失
盗链看起来可能是个小问题,但消耗的带宽可能很大——特别是在配额严格的共享主机计划上。以下是带宽消失速度的具体分析:
| 场景 | 每天带宽 | 每月带宽 |
|---|---|---|
| 200KB 图像 × 每天10,000个外部访客 | ~2 GB | ~60 GB |
| 500KB 图像 × 每天10,000个外部访客 | ~5 GB | ~150 GB |
| 5MB PDF × 每天1,000次下载 | ~5 GB | ~150 GB |
大多数共享主机计划每月包括10-30GB的带宽。一个热门盗链来源可以在数天内耗尽您的整个配额。启用防盗链保护是阻止这种情况发生的最直接方式。
WordPress网站的防盗链保护
如果您运行WordPress,有其他方法可以超越.htaccess来保护您的媒体文件:
通过functions.php
将以下代码片段添加到您主题的 functions.php 以在PHP级别拦截和阻止盗链请求:
// 在WordPress中阻止盗链图像和文件
function block_hotlinks() {
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
$allowed = 'yourdomain.com';
if ($referer && strpos($referer, $allowed) === false) {
$ext = pathinfo(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), PATHINFO_EXTENSION);
if (in_array(strtolower($ext), ['jpg','jpeg','png','gif','webp','pdf'])) {
header('HTTP/1.1 403 Forbidden');
exit;
}
}
}
add_action('init', 'block_hotlinks');
注意:.htaccess 级别的保护总是更好,因为它在PHP或WordPress加载前阻止请求,使用更少的服务器资源。
推荐的插件
- All In One WP Security ——在"文件系统"部分包含内置的防盗链保护切换开关
- WP Cerber Security ——将防盗链阻止与机器人保护和恶意软件扫描相结合
显示警告图像而不是阻止
您可以将盗链请求重定向到"禁止盗链"图像,而不是返回403——这样其他网站会显示您的警告信息:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?yourdomain\.com/ [NC]
RewriteRule \.(jpg|jpeg|png|gif|webp)$ /img/no-hotlink.jpg [R=302,NC,L]
在您的 /img/ 目录中创建 no-hotlink.jpg ——例如,一个显示"请访问yourdomain.com获取此内容"的图像。
允许多个域
如果您有需要访问权限的CDN、测试服务器或多个域,为每个域添加一个 RewriteCond:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?yourdomain\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?yourdomain2\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^https?://cdn\.yourdomain\.com/ [NC]
RewriteRule \.(jpg|jpeg|png|gif|webp|pdf)$ - [F,NC,L]
验证防盗链是否正常工作
- 打开您浏览器的开发者工具 → 网络选项卡
- 直接访问图像URL——它应该正常加载(无引用者=允许)
- 在不同的域上创建临时HTML页面(或使用codepen.io),嵌入您的图像URL
- 如果配置正确,图像将返回403或显示您的警告图像
注意: Google Bot和社交媒体爬虫(Facebook、Twitter)发送引用者的方式不同。如果您需要Open Graph预览图像正常工作,请确保允许空引用者——这已由 !^$ 条件处理。
需要牢记的事项
- 隐私/隐身浏览器可能不会发送引用者 ——这些请求将被视为直接访问并被允许通过
- HTTPS到HTTP引用者被隐藏 ——浏览器在从HTTPS导航到HTTP时不发送引用者,这可能导致误报
- 无SEO影响 ——Google直接爬虫图像,不发送盗链风格的引用者,因此您的图像索引不受影响
Cloudflare和CDN的防盗链保护
如果您的网站已经使用Cloudflare或CDN,在网络边缘而不是服务器级别有更强大的选项可用。
Cloudflare Scrape Shield
Cloudflare在仪表板的 Security > Scrape Shield 部分提供内置的 防盗链保护。启用它只需单击一次,不需要更改您的服务器文件。关键优势是Cloudflare在边缘阻止请求——在它甚至到达您的源服务器之前——所以对您的服务器负载或带宽零影响。
- 自动保护所有文件类型,不需要扩展名列表
- 即使您的服务器关闭或维护中也能工作
- 与所有主机计划兼容,包括共享主机
CDN Pull Zone白名单
如果您在源服务器旁边使用Bunny CDN或KeyCDN等CDN,您必须将CDN的pull域加入白名单。否则CDN无法从您的源获取资产:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?yourdomain\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^https?://[^.]+\.b-cdn\.net/ [NC]
RewriteRule \.(jpg|jpeg|png|gif|webp|pdf)$ - [F,NC,L]
用您的CDN仪表板中显示的实际pull zone主机名替换 b-cdn.net。
比较:防盗链方法
| 方法 | 级别 | 难度 | 最适合 |
|---|---|---|---|
| DirectAdmin GUI | Apache | 非常简单 | 初学者 |
| .htaccess 手动 | Apache | 中等 | 细粒度控制 |
| Cloudflare Scrape Shield | Edge/CDN | 非常简单 | 已在使用Cloudflare |
| WordPress插件 | PHP | 简单 | WordPress网站 |