防盗链(Referer-based Access Control)是防止其他网站直接链接到你服务器上的资源(如图片、视频、文件等)的一种技术。以下是使用Nginx实现防盗链的详细方法:
location ~* \.(jpg|jpeg|png|gif|mp4|flv|swf|zip|rar|pdf|doc|docx|xls|xlsx|ppt|pptx)$ {
valid_referers none blocked server_names
*.yourdomain.com
~\.google\. ~\.bing\. ~\.yahoo\.
~\.baidu\. ~\.so\. ~\.sogou\.
~\.youdao\. ~\.yandex\.
~\.facebook\. ~\.twitter\.;
if ($invalid_referer) {
return 403;
# 或者可以返回一张替代图片
# rewrite ^/.*$ /path/to/anti-hotlink.png break;
}
}
location匹配:~*
表示不区分大小写的正则匹配,后面跟着需要保护的文件扩展名
valid_referers:定义合法的来源
none
:直接访问(无Referer头)blocked
:Referer头存在但被防火墙或代理删除server_names
:允许本服务器名访问处理非法引用:当Referer不在白名单中时,可以:
valid_referers none blocked server_names ...
valid_referers ... ~\.google\. ~\.bing\. ~\.yahoo\. ...
map $http_referer $bad_referer {
hostnames;
default 0;
"~*spam-site\.com" 1;
"~*scraper\.org" 1;
}
server {
...
if ($bad_referer) {
return 403;
}
}
location /protected/ {
secure_link $arg_md5,$arg_expires;
secure_link_md5 "$secure_link_expires$uri$remote_addr secret";
if ($secure_link = "") {
return 403;
}
if ($secure_link = "0") {
return 410;
}
}
Referer可以被伪造:防盗链不是绝对安全的,Referer头可以被修改
影响用户体验:过于严格的规则可能会阻止合法用户访问
测试配置:修改后务必测试各种访问场景
性能考虑:正则表达式匹配会影响性能,尽量简化规则
CDN兼容:如果使用CDN,需要确保CDN的Referer被允许
通过以上配置,你可以有效防止其他网站盗用你的服务器资源,节省带宽并保护内容版权。