通过Nginx配置防盗链,说白了就是给资源加一把锁,让别人没法随便拿走你的图片、视频或文件。下面直接上干货,从基础到高级,一步步说清楚怎么配置。
1. 基本防盗链配置
1.1 允许特定域名访问
最简单的做法是只让某些域名能访问你的资源,其他域名一律拒绝。比如,你只希望自己的主站和子站能用,别人想直接引用,直接返回403。
server {
listen 80;
server_name example.com;
location /protected/ {
valid_referers none blocked server_names example.com www.example.com;
if ($invalid_referer) {
return 403;
}
# 其他配置,如代理、缓存等
}
}
1.2 允许特定文件类型
如果你只想保护图片、视频这类多媒体文件,可以按文件类型来限制。比如只允许图片(jpg、png、gif)和视频(mp4、avi、mov)被特定域名引用,其他文件类型不受影响。
server {
listen 80;
server_name example.com;
location ~* .(jpg|jpeg|png|gif|mp4|avi|mov)$ {
valid_referers none blocked server_names example.com www.example.com;
if ($invalid_referer) {
return 403;
}
# 其他配置,如代理、缓存等
}
}
2. 高级防盗链配置
2.1 使用签名验证
如果referer策略不够用,可以上更严格的签名验证。思路是:你生成一个签名,请求时带上这个签名,服务器端校验。签名不对,直接拒绝。这样就算别人伪造了referer也绕不过去。
server {
listen 80;
server_name example.com;
location /protected/ {
set $signature "";
if ($arg_signature != "") {
set $signature $arg_signature;
}
valid_referers none blocked server_names example.com www.example.com;
if ($invalid_referer) {
return 403;
}
# 验证签名
if ($signature != "your_generated_signature") {
return 403;
}
# 其他配置,如代理、缓存等
}
}
2.2 使用Token验证
Token验证跟签名类似,但更灵活——你可以给每个用户或每次请求生成不同的Token,过期作废。配置方法和签名差不多,但注意Token的生成逻辑要足够安全,不能让人轻易猜出来。
server {
listen 80;
server_name example.com;
location /protected/ {
set $token "";
if ($arg_token != "") {
set $token $arg_token;
}
valid_referers none blocked server_names example.com www.example.com;
if ($invalid_referer) {
return 403;
}
# 验证Token
if ($token != "your_generated_token") {
return 403;
}
# 其他配置,如代理、缓存等
}
}
3. 注意事项
- 性能影响:复杂的防盗链逻辑(比如签名验证、Token验证)会增加Nginx的CPU开销,高并发场景下尤其明显。如果只是简单防扒,用referer就够了。
- 安全性:签名和Token的生成算法一定要保密,别用简单的md5拼接,最好加盐、加时间戳,防止被暴力破解。
- 灵活性:实际场景中,你可能需要允许某些特定的子域名,或者给CDN节点白名单。记得根据实际需求调整valid_referers的规则。
通过以上配置,Nginx的防盗链功能就能跑起来了,资源不会轻易被别人白嫖。记住一点:没有绝对安全的防盗链,但多一层防护,就多一分安心。