客户在云南昆明市官渡区做鲜花批发,网站主要是展示各种鲜花的品种、价格和库存,图片特别多,每个品种都有好几张实拍图。那天客户发来消息说,这个月服务器流量超了,被扣了不少钱,问是不是访问量涨了。
登录服务器,用宝塔面板的流量监控看了一下,发现流量消耗确实比平时高了好几倍,但访问量并没有明显增长。这种情况通常是有人盗用了网站上的图片,把图片地址直接嵌到别的网站上,流量全从我们这边走。
确认盗链
在nginx访问日志里搜了一下图片的请求来源,找到几个Referer不是自己域名的记录,来源IP都是同一个,指向了一个陌生的网站。打开那个网站看了一眼,确实在大量引用客户网站上的鲜花图片,而且连图片地址都没改,直接用了原链接。
这种情况就是典型的盗链。对方网站自己不存图片,直接引用别人的图片地址,省了自己的存储和流量成本,把负担转嫁给了被引用的网站。
配置防盗链
解决办法是在nginx里配置Referer白名单,只允许自己的域名和搜索引擎的Referer来访问图片,其他来源直接拒绝。
在网站的nginx配置文件里加了一段:
location ~ .*\.(gif|jpg|jpeg|png|webp|bmp|swf)$ { valid_referers none blocked server_names *.example.com *.baidu.com *.google.com *.sogou.com *.so.com; if ($invalid_referer) { return 403; } expires 30d; access_log off; }
这段配置的意思是:只允许空Referer、被屏蔽的Referer、自己域名、以及主流搜索引擎的Referer来访问图片。其他来源一律返回403。
这里有个细节要注意:none和blocked这两个关键词不能少。none允许直接在浏览器地址栏输入图片URL访问,blocked允许Referer被防火墙或代理屏蔽的情况。这两个如果不加,用户直接访问图片地址会被拒绝,体验不好。搜索引擎的Referer也要加进去,不然百度、Google抓取图片的时候会被拦,影响图片搜索收录。
加了防盗链之后的效果
配置生效之后,再去看nginx日志,那些来自陌生域名的图片请求全部返回403,流量很快就降下来了。客户的服务器流量恢复到了正常水平,那个盗链的网站打开之后图片全裂了,没几天就把图片链接撤掉了。
顺手做的几个优化
趁着改nginx配置,顺便给客户的网站做了几个其他的优化:
一是给图片加了缓存时间。上面配置里的expires 30d就是让浏览器缓存图片30天,用户第二次访问的时候直接从本地读,不用再请求服务器。这个对鲜花批发网站来说很实用,客户群相对固定,经常来回看图片,加了缓存之后体验提升明显。
二是检查了图片大小。客户上传的鲜花图片都是手机直接拍的,一张好几兆,页面上加载特别慢。用工具批量压缩了一遍,转成WebP格式,图片体积减少了七成左右,页面打开速度提升了不少。
三是把图片切到了CDN上。客户图片多,全走服务器带宽压力大。切到CDN之后,全国各地的用户就近加载图片,速度更快,服务器的带宽消耗也降下来了。
客户那边的情况
客户在昆明官渡区做鲜花批发,客户群主要是各地的花店和婚庆公司,很多客户是通过网站看图选货然后下单。他说之前只知道有人会盗用文章,没想到图片也会被盗。这次流量超了之后才意识到这个问题。
他问以后怎么防止。我说防盗链配置加上之后,基本的盗链就挡住了。如果对方是那种特别执着的,可能会伪造Referer或者把图片下载到自己服务器上,那就没办法了。但大部分盗链都是图省事直接引用链接,加了防盗链基本都能拦住。
一点补充
防盗链配置有一个注意的地方:如果网站本身有多个子域名,或者和别的网站有合作关系需要互相引用图片,记得把对方的域名加到白名单里,不然合法引用也会被拦。
还有一点是如果网站用了CDN,防盗链最好也在CDN层面配置一份。CDN的节点缓存了图片之后,如果不做防盗链,别人还是能直接从CDN节点上拉取图片,流量照样消耗。阿里云CDN和腾讯云CDN都支持Referer防盗链配置,在控制台里设置一下就行。
