为了防止资源给盗用,从而给我们的所在服务器造成额外的负担,需要采取防盗链的措施。
使用 nginx 模块ngx_http_referer_module
来阻挡来源非法的域名请求,以下我们利用 referer 指令实现防盗链。
文件类型防盗链
# 需要防盗的后缀
location ~* \.(jpg|jpeg|png|gif|bmp|swf|rar|zip|doc|xls|pdf|gz|bz2|mp3|mp4|flv)$
#设置过期时间
expires 30d;
# valid_referers 就是白名单的意思
# 支持域名或ip
# 允许ip 192.168.0.1 的请求
# 允许域名 *.google.com 所有子域名
valid_referers none blocked 192.168.0.1 *.google.com;
if ($invalid_referer) {
# return 403;
# 盗链返回的图片,替换盗链网站所有盗链的图片
rewrite ^/ https://site.com/403.jpg;
}
root /usr/share/nginx/img;
}
以上配置主要看 valid_referers,这个变量代表只允许网址访问,上面配置中允许 IP 为 192.168.0.1 和 Google 搜索引擎访问图片该服务下的资源,否则就重定向到一张默认图片
valid_referers 参数说明
valid_referers none | blocked | server_names | string …;
none:缺少“Referer”请求头;
blocked:“Referer” 请求头存在,但是它的值被防火墙或者代理服务器删除。这些值都不以“http://” 或者 “https://”字符串作为开头;
server_names:“Referer” 请求头包含某个虚拟主机名;
任意字符串:定义一个服务器名和可选的URI前缀。服务器名允许在开头或结尾使用“*”符号。当nginx检查时,“Referer”请求头里的服务器端口将被忽略;
正则表达式:必须以“~”符号作为开头。 需要注意的是表达式会从“http://”或者“https://”之后的文本开始匹配;
如果不允许通过文件直链进行访问和下载,只能在限定的域名中引用和下载,删除valid_referers
这行代码中的none
和 blocked
这两个值即可。
指定目录防盗链
location /images/ {
alias /data/images/;
valid_referers none blocked server_names *.moewah.com *.mao.sh ;
if ($invalid_referer) {return 403;}
}
伪造 Referer 的请求很容易实现,所以这种方法无法真正阻止有心的盗链
网友评论