天天看点

OSS防盗链(Referer)配置及错误排除

<code>referer</code>是http header的一部分,当浏览器向web服务器发送请求时,一般会带上referer,告诉服务器从哪个页面链接过来的。

<code>referer</code>其实应该是单词<code>referrer</code>,不过拼错的人太多了,编写标准的人也就将错就错了。

防盗链。比如,网站访问自己的图片服务器,图片服务器取到referer来判断是不是自己的域名,如果是就继续访问,不是则拦截。

数据统计。比如,统计用户是从哪里链接过来访问的。

空referer指的是http请求中referer头部的内容为空,或者http请求中不包含referer头部。

下面两种情况referer为空:

当请求并不是由链接触发产生。比如,直接把地址输入地址栏里打开页面;

从https页面上的链接访问到非加密的http页面时,在http页面上是检查不到referer的。

在防盗链设置中,允许空referer和不允许空referer有什么区别呢?

在防盗链的白名单设置中,如果指名白名单中包含空的referer,那么通过浏览器地址栏直接访问该资源url是可以访问到的;

但如果不指名需要包含空的referer,那么通过浏览器直接访问也是被禁止的。

oss防盗链包括:

是否允许referer字段为空的请求访问;

referer字段白名单。

oss防盗链配置中有以下注意点:

用户只有通过url签名或者匿名访问object时,才会做防盗链验证。请求header中有<code>authorization</code>字段时,不会做防盗链验证;

一个bucket可以支持多个referer参数,这些参数之间由<code>,</code>分隔;

referer参数支持通配符<code>*</code>和<code>?</code>,详细解释参见下面的通配符说明;

用户可以设置<code>是否允许referer字段为空</code>的请求访问;

白名单为空时,不会检查referer字段是否为空(不然所有的请求都会被拒绝);

白名单不为空,且设置了不允许referer字段为空的规则;则只有referer属于白名单的请求被允许,其它请求(包括referer为空的请求)会被拒绝;

如果白名单不为空,但设置了允许referer字段为空的规则;则referer为空的请求和符合白名单的请求会被允许;其它请求都会被拒绝;

bucket的三种权限(private,public-read,public-read-write)都会检查referer字段。

通配符说明:

星号<code>*</code>:代替0个或多个字符。如果正在查找以aew开头的一个文件,但不记得文件名其余部分,可以输入aew,查找以aew开头的所有文件类型的文件,如aewt.txt、aewu.exe、aewi.dll等。要缩小范围可以输入aew.txt,查找以aew开头的所有文件类型并.txt为扩展名的文件如aewip.txt、aewdf.txt。

问号<code>?</code>:代替一个字符。如果输入love?,查找以love开头的一个字符结尾文件类型的文件,如lovey、lovei等。要缩小范围可以输入love?.doc,查找以love开头的一个字符结尾文件类型并.doc为扩展名的文件如lovey.doc、loveh.doc。

所有请求都可以访问

空refer:允许refer为空

refer列表: 空

带规定的referer的请求才能访问

空refer:不允许refer为空

带规定的referer的请求、不带referer的请求可以访问

当referer配置错误时,http状态码(http code)是403,oss返回如下错误:

提示: referer报错一般是站点类应用,浏览器中可以查看header的referer。如chrome,按 <code>f12</code> 打开 <code>开发者工具</code> ,在 <code>network</code> 中查看相应元素的header; oss返回的错误可以通过抓包获取。如wireshark,筛选器可以指定为 <code>host bucket-name.oss-cn-beijing.aliyuncs.com</code> 。

可能的问题:

referer为空,请求header中没有referer字段或者referer字段为空。

referer不在规定的referer范围内。以下几点请注意:

<code>http://</code>还是<code>https://</code>配置时请确认;

a.aliyun.com和b.aliyun.com,匹配于<code>http://*.aliyun.com</code>或<code>http://*.aliyun.com</code>;

domain.com匹配于<code>http://domain.com</code>,而不是<code>http://*.domain.com</code>;

referer格式错误,refer配置必须带<code>http://</code>或者<code>https://</code>,否则无效。如b.aliyun.com是无效配置。

在 <code>对象存储oss -&gt; bucket -&gt; bucket属性 -&gt; 防盗链</code> 中配置referer; 调试时请清空浏览器缓存; oss的refer只支持 白名单, 暂时不支持黑名单 。

设置防盗链后,用curl还是能抓到视频?

继续阅读