阿里云oss+cdn防盗链实施

最近阿里云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)。建议的写法是:

<img src="//cdn.xxx.com/abc.jpg" />

了解这个情况后就好办了

要么在把数据库图片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流量是否还会飙高!

每日壁纸

留下评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注