防盗链(Hotlink Protection)是防止其他网站直接链接到你网站资源(如图片、视频、CSS/JS文件等)的一种技术手段。以下是Nginx防盗链的几种配置方法:
location ~* \.(jpg|jpeg|png|gif|webp|css|js|mp4|flv|swf)$ {
valid_referers none blocked server_names
*.yourdomain.com
~\.google\. ~\.bing\. ~\.yahoo\.
~\.baidu\. ~\.so\. ~\.sogou\.
~\.youdao\. ~\.soso\. ~\.360\.
~\.feedburner\. ~\.feedsky\.;
if ($invalid_referer) {
return 403;
# 或者可以重定向到一个提示图片
# rewrite ^ /anti-hotlink.jpg;
}
}
valid_referers
定义允许的来源:
none
- 直接访问(无Referer)blocked
- 有Referer但被防火墙或代理删除server_names
- 本服务器名~
开头的模式$invalid_referer
变量会在Referer不匹配时设置为1
valid_referers none blocked server_names;
valid_referers none blocked server_names
*.yourdomain.com
~\.google\. ~\.bing\. ~\.yahoo\.
~\.baidu\. ~\.so\. ~\.sogou\.
~\.youdao\. ~\.soso\. ~\.360\.;
if ($invalid_referer) {
return 403;
# 或者
# rewrite ^ /path/to/anti-hotlink.jpg;
}
location /images/ {
valid_referers none blocked server_names *.yourdomain.com;
if ($invalid_referer) {
return 403;
}
}
更安全的防盗链方式(需要Nginx编译时包含--with-http_secure_link_module
):
location /download/ {
secure_link $arg_md5,$arg_expires;
secure_link_md5 "your_secret_key$secure_link_expires$uri";
if ($secure_link = "") {
return 403;
}
if ($secure_link = "0") {
return 410;
}
}
nginx -t
nginx -s reload
# 测试允许的Referer
curl -I -H "Referer: http://www.yourdomain.com" http://yourserver.com/image.jpg
# 测试不允许的Referer
curl -I -H "Referer: http://othersite.com" http://yourserver.com/image.jpg
希望这些配置能帮助你有效防止资源盗链。根据实际需求调整白名单和规则即可。