Hotlink Protection DirectAdmin

盗链是指其他网站直接将您的图像或文件URL嵌入到他们的页面中。每次访客加载那个页面时,您的服务器都会传输该文件,消耗您的带宽,但不会为您带来任何流量。在共享主机上,这会迅速耗尽您的带宽配额,甚至导致您的账户被暂停。

什么是盗链?为什么这是个问题?

假设您的图像在 https://yourdomain.com/img/product.jpg,而另一个网站使用 <img src="https://yourdomain.com/img/product.jpg">。那个外部网站的每位访客都会导致您的服务器发送该文件——您支付带宽费用,而他们却受益于您的资源。

后果包括:

方法1:通过DirectAdmin GUI启用

DirectAdmin包含内置的防盗链功能,您无需手动编辑 .htaccess 即可启用:

  1. 登录到DirectAdmin → 点击 Advanced Features(高级功能)
  2. 选择 Hotlink Protection(防盗链保护)
  3. 切换 Enable Hotlink Protection(启用防盗链保护)为开启
  4. 输入 Allowed URLs(允许的URL)——允许链接您的文件的域名(包括您自己的域名)
  5. 输入 Allowed Extensions(允许的扩展名)——要保护的文件类型,例如 jpg,jpeg,png,gif,webp,pdf,mp3,mp4
  6. 设置 Redirect URL(重定向URL)——要显示的"禁止盗链"图像
  7. 点击 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]

每个条件的工作方式:

保存前用您实际的域名替换 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加载前阻止请求,使用更少的服务器资源。

推荐的插件

显示警告图像而不是阻止

您可以将盗链请求重定向到"禁止盗链"图像,而不是返回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]

验证防盗链是否正常工作

  1. 打开您浏览器的开发者工具 → 网络选项卡
  2. 直接访问图像URL——它应该正常加载(无引用者=允许)
  3. 在不同的域上创建临时HTML页面(或使用codepen.io),嵌入您的图像URL
  4. 如果配置正确,图像将返回403或显示您的警告图像

注意: Google Bot和社交媒体爬虫(Facebook、Twitter)发送引用者的方式不同。如果您需要Open Graph预览图像正常工作,请确保允许空引用者——这已由 !^$ 条件处理。

需要牢记的事项

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网站

支持完整.htaccess的泰国虚拟主机

AsiaGB虚拟主机在所有计划上都支持mod_rewrite和防盗链保护——从500泰铢/年起,提供99% SLA正常运行时间。

查看虚拟主机计划