php 实现防盗链
防盗链的基本原理
防盗链(Hotlink Protection)是一种防止其他网站直接链接到你的资源(如图片、视频、文件等)的技术。通过检查HTTP请求头中的Referer字段,可以判断请求是否来自合法域名。
使用.htaccess文件实现
Apache服务器可以通过.htaccess文件实现防盗链。以下是一个典型的配置示例:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(www\.)?yourdomain\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule \.(jpg|jpeg|png|gif|mp4)$ - [NC,F,L]
NC表示不区分大小写。F返回403禁止访问状态码。L表示这是最后一条规则。
PHP代码实现防盗链
在PHP中,可以通过检查$_SERVER['HTTP_REFERER']来实现防盗链:
$allowed_domains = ['yourdomain.com', 'www.yourdomain.com'];
$referer = $_SERVER['HTTP_REFERER'] ?? '';
$is_allowed = false;
foreach ($allowed_domains as $domain) {
if (strpos($referer, $domain) !== false) {
$is_allowed = true;
break;
}
}
if (!$is_allowed && !empty($referer)) {
header('HTTP/1.1 403 Forbidden');
exit('Access denied - Hotlinking not allowed');
}
使用Nginx配置实现
对于Nginx服务器,可以在配置文件中添加以下内容:

location ~* \.(jpg|jpeg|png|gif|mp4)$ {
valid_referers none blocked yourdomain.com www.yourdomain.com;
if ($invalid_referer) {
return 403;
}
}
动态生成资源
另一种更安全的方法是动态生成资源链接,而不是直接提供静态文件URL:
// 生成带令牌的图片URL
function generate_secure_url($file_path) {
$secret = 'your_secret_key';
$token = md5($secret . $file_path . time());
return "download.php?file=" . urlencode($file_path) . "&token=$token";
}
// 验证并输出文件
$file = $_GET['file'] ?? '';
$token = $_GET['token'] ?? '';
if (verify_token($file, $token)) {
header('Content-Type: ' . mime_content_type($file));
readfile($file);
} else {
header('HTTP/1.1 403 Forbidden');
exit('Invalid access token');
}
使用CDN的防盗链功能
许多CDN服务(如Cloudflare、阿里云CDN等)都提供内置的防盗链功能。通常可以通过控制面板设置允许的Referer白名单,或者配置时间限制的访问令牌。
注意事项
Referer头可以被伪造,不能完全依赖这种方式进行安全保护。- 某些浏览器或隐私设置可能不发送
Referer头,需要特别处理这种情况。 - 对于重要资源,建议结合多种保护措施,如动态URL生成、访问控制等。






