最近阿里云cdn消费一直居高不下,网站流量也没见涨多少,怀疑有人刷CDN的流量,于是查询阿里云cdn后台根据统计分析里面果然有一个文件流量都是几个G,这个和我的小站流量完全不匹配,查询热门Refer,空Refer的流量也是非常高。于是决定实施阿里云cdn的防盗链功能。
首先我的网站是destoon的系统,采用的esc+rds+oss+cdn的架构,网站也是从http升级到https过来的,源站里面有大量的http://的图片资源,在设置阿里云“允许通过浏览器地址栏直接访问资源URL”的时候,源站总有图片打不开,后来再网上查询资料发现:
今天发现,阿里云 CDN 的 Refer 防盗链并没有真正防止白名单外的域名调用 OSS 的图片。经过一番研究发现,这跟 https 有关。
我在阿里云开通了 OSS 来存在图片,并使用 CDN 访问,在 CDN 中开启了 https,但并不强制。并且使用“白名单”的方式来设置 Refer 防盗链。关键是开启了“允许空 Referer”。
我在 http://b.com/ 上测试调用 http 和 https 的图片都是打不开的(防盗链有效),但是在 https://b.com/ 上却能显示 http 的图片(防盗链失效):
究其原因,是 https 页面在调用 http 图片时请求头不包含 Referer 字段,导致 CDN 判断 Referer 为空,这时候如果开启了为空也允许访问的话,就会出现防盗链失效的情况了。
总结:如果 CDN 开启了 https 访问,那么不要允许空 Referer。这里白名单内的网站必须使用与 CDN 一致的 protocol(http 或 https)。建议的写法是:
了解这个情况后就好办了
要么在把数据库图片url全部替换了,要么通过php进行替换
destoon涉及到三个文件:
/module/article/list.inc.php 这个是列表的php文件
在46行插入 $r['thumb'] = str_replace('http:', '', $r['thumb']);
module/article/show.inc.php这个是文章详情页文件
在62行和大约80行左右 插入
$content = str_replace('http://img.xxxx.com/', '//img.xxxx.com/', $content);
include/tag.func.php这个是tag标签解析文件
在106行插入
if(isset($r['thumb'])) $r['thumb'] = str_replace('http:', '', $r['thumb']);
至此问题解决,看看后续CDN流量是否还会飙高!