彧繎博客的内容经常被大量采集,有些人采集就采集连个图片地址都要用本站的,简直让人发毛,赶上搬迁服务器,升级环境顺便做点防护,主要是像图片、视频、CSS样式、JS脚本等等静态资源地址被他人盗取引用,会浪费自己服务器资源,做网站不是做慈善,下面主要介绍了关于 Nginx 配置防盗链功能的详解。
防盗链工作原理
了解实现防盗链的原理之前,必须需要了解一下 HTTP 头返回的 Referer 参数信息,当用户使用浏览器向 Web 服务器发送请求的时候,一般都会带上这个 Referer 参数信息,它告诉浏览器该网页是从哪个网站链接访问过来的,如下图:
服务器根据获取到的 Referer 参数信息,进行判断是否为自己信任的网站地址,如是服务器信任的网站地址,则给予显示并放行继续访问,如不是服务器信任的网站地址,则返回 4XX 的状态信息,进行服务端的拒绝访问,概念如下:
语法和参数介绍
当浏览器将 Referer 参数信息传递给 Nginx 服务端,Nginx 会通过查看浏览器传递过来的 referer 参数信息并自动和服务端的 valid_referers 参数内容进行匹配,匹配的过程中不区分大小写,匹配完成后会通过 $invalid_referer 判断后变量通知到浏览器。
valid_referers none blocked server_names
none:返回的 Referer 为空,允许访问,通俗就是直接访问。
blocked:返回的 Referer 不为空,允许不带协议的请求访问。
server_names:指定域名或IP地址,支持 正则表达式 和 * 通配字符串,使用正则表达式,需要以“~”开头表示。
防盗链实例操作
以上所述的 valid_referers 语法是要在 server 或 location 段中加入 valid_referers none blocked,其中 none 表示 Referer 为空的来路可以就是直接访问,而 blocked 表示被防火墙标记过的来路,后面紧跟 server_names 域名,类似白名单,可以使用 * 通配符,详细使用方法如下:
# 防盗链配置,需添加到 server 段内 location ~ .*\.(png|gif|jpeg|jpg|svg|webp|bmp|js|css)$ // 防盗文件后缀格式,需用|隔开 { expires 30d; // 缓存30秒 access_log /dev/null; // 关闭错误日志 valid_referers none blocked opssh.com *.opssh.com; // none 表示可以直接访问,blocked 表示被防火墙标记过的来路,跟随 server_names 白名单域名 if ($invalid_referer){ // 判断 valid_referers 内的域名 return 403; // 返回显示403状态或其他状态码 # rewrite /.* /zb_users/upload/2022/11/202211184265_614.png break; // 返回一张防盗图片 } }
当然一定会有人考虑到防盗链会影响搜索引擎抓取,导致出图率或其他异常问题,那么就需要使用到 server_names 进行正则表达式,让搜索引擎的站点都可以访问到当前站点的图片,要注意使用正则表达式,需要以“~”开头表示,详细实例如下:
# 防盗链配置,需添加到 server 段内 location ~ .*\.(png|gif|jpeg|jpg|svg|webp|bmp|js|css)$ // 防盗文件后缀格式,需用|隔开 { expires 30d; // 缓存30秒 access_log /dev/null; // 关闭错误日志 valid_referers none blocked opssh.com *.opssh.com ~\.google\. ~\.baidu\. ~\.so\. ~\.toutiao\. ~\.bing\. ~\.sm\. ~\.sogou\.; // 1、跟随 server_names 白名单域名和正则表达式域名,注意空格 valid_referers none blocked opssh.com *.opssh.com baidu.com *.baidu.com google.com *.google.com *.bing.com *.sm.cn *.so.com *.sogou.com *.toutiao.com *.yandex.com; // 2、跟随 server_names 白名单域名,注意空格,二选一,这种出错率低 if ($invalid_referer){ // 判断 valid_referers 内的域名 return 403; // 返回显示403状态或其他状态码 # rewrite /.* /zb_users/upload/2022/11/202211184265_614.png break; // 返回一张防盗图片 } }
防盗链实例检测
完成以上防盗链内容的修改后,重启 Nginx 使用以下命令测试,信任域名返回为 200,未信任域名返回为 403,如下图:
curl --referer https://测试域名 -I https://你的图片地址
防盗链最后总结
此方法并非 100% 的防盗,通过 Referer 实现防盗链比较基础,仅可以简单实现方式资源被盗用,构造 Referer 的请求信息是很容易实现的,不过应付一般简单的盗用链接够用了,如果你不在乎流量,只是不想别人使用你的图片,那么你就可以使用 rewrite 返回一张嘲讽的图片,自行脑补~
相关文章
发表评论
评论列表