概述
为防止存储于阿里云对象存储OSS的数据被其他人盗链而产生额外的费用,需要在OSS控制台的防盗链功能设置Referer白名单,限制仅白名单中的域名可以访问Bucket内的资源。本文主要介绍OSS防盗链配置的配置示例及常见问题的解决方法。
详细描述
OSS防盗链可通过在OSS控制台或使用OSS SDK设置Bucket属性来配置,防盗链的设置请参见防盗链。
OSS防盗链配置示例
以help.example.com
域名为例,配置防盗链,具体配置示例如下:
- 设置不允许Referer为空的同时设置Referer白名单
说明:当设置不允许refer为空,Referer白名单为空时,不会检查Referer字段是否为空,所以这个设置无效,因此需要设置Referer白名单。
- 设置方法:
请参见设置防盗链,在防盗链区域,设置不允许Referer为空,并在Referer框中,Referfer白名单设置的示例如下:
- Referer白名单设置为
http://help.example.com/index.html
,但由于OSS的Referer检查是通过前缀匹配的,因此其他网页将无法访问,比如http://help.example.com/logo.html
,所以Referer白名单可以配置成http://help.example.com/
。 - 假设还有其他域名需要访问,例如
http://example.help.example.com/index.html
也需要访问,那么Referer白名单应该添加为http://*.help.example.com/
。
- Referer白名单设置为
- 防盗效果:
- 访问
http://[$Bucket_URL]/index.html
,Referer为空,返回403错误码。说明:
[$Bucket_URL]
为Bucket中文件的访问地址。- 不允许空Referer的请求,因此返回403错误码。
- 访问
http://help.example.com/logo.html
,请求来自于源站,访问成功。 - 访问
http://help.example123.com/index.html
,请求来自于盗链网站,OSS返回403错误,防盗链成功。 - 访问
http://example.help.example.com/index.html
,请求来自于源站的三级域名,访问成功。说明:如果Referer白名单中只有
http://help.example.com/
,浏览器模拟三级域名访问时,三级域名无法匹配Referer白名单,OSS就会返回403错误码。
- 访问
- 设置方法:
- 设置允许Referer为空的同时设置Referer白名单
- 设置方法:
请参见设置防盗链,在防盗链区域,设置允许Referer为空,并在Referer框中,Referfer白名单设置的示例如下:http://help.example.com/
系统显示类似如下。
http://*.help.example.com/
- 设置方法:
-
- 防盗效果:
- 访问
http://[$Bucket_URL]/index.html
,Referer为空,访问成功。 - 访问
http://help.example.com/logo.html
,请求来自于源站,访问成功。 - 访问
http://help.example123.com/index.html
,请求来自于盗链网站,OSS返回403错误,防盗链成功。 - 访问
http://example.help.example.com/index.html
,请求来自于源站的三级域名,访问成功。
- 访问
- 防盗效果:
常见问题
如果设置防盗链之后,无法访问OSS资源,请在浏览器中查看Header的Referer值,查看配置是否正确。比如,在Chrome浏览器中按F12键,打开开发者工具,在Network中查看具体请求携带的Referer,检查与对应OSS中设置的Referer是否匹配。如果不匹配,请修改参见OSS防盗链配置注意事项,检查防盗链配置,重新设置防盗链。
说明:如果您设置了不允许Referer为空,访问出现异常,请先查看浏览器返回的Referer,然后在防盗链配置中将其添加相应的链接。
- 问题一:配置防盗链后使用curl命令还是能获取到OSS资源
- 错误原因:OSS配置防盗链后白名单未生效的原因如下:
- Bucket的权限为公共读写。
- 如果使用了CDN加速资源,可能开启了CDN并且没有配置CDN中的Referer。
- 解决方法:OSS配置防盗链后未生效的解决方法如下:
- 检查Bucket的权限是否为公共读写,建议改为私有权限。
- 检查是否开启了CDN。CDN的Referer设置不能为空,且防盗链名单需与OSS一致,CDN配置Referer防盗链的方法请参见配置Referer防盗链。
说明 :如果您使用了CDN加速,Referer建议在CDN上进行配置。因为如果在OSS进行配置,CDN上第一次请求带Referer回源OSS返回正常的文件,CDN上进行缓存,后面即使不带Referer也会响应正常的文件,因此建议在CDN上配置。
- 如果问题还是无法解决,请参见由于防盗链异常导致访问CDN返回403错误的解决方法。
注意:调试OSS的Referer时,请先排除CDN的影响,且优先调试OSS的Referer,再调试CDN的Referer。
- 错误原因:OSS配置防盗链后白名单未生效的原因如下:
- 问题二:当Referer配置错误时HTTP访问提示403错误且OSS提示“You are denied by bucket referer policy.”错误
如果设置的Referer不允许为空,则只有预先设定好的Referer才可以进行访问,其他Referer访问会被拦截。在浏览器中直接请求图片URL时Referer为空,故请求失败返回403错误。如无特殊需求,可将设置改为允许空Referer,详情请参见设置OSS防盗链后访问OSS资源出现“You are denied by bucket referer policy”错误。 - 问题三:
*.domain.com
可以匹配二级域名,但无法匹配domain.com
,另外添加一行domain.com
也没效果,如何配置?
一般的Referer中会带http
或者https
这样的参数,可以通过Chrome浏览器的开发者模式查看请求的Referer是,然后再进行设置。需要添加http://
或https://
。 - 问题四:防盗链设置没有生效该如何解决?
在浏览器中查看Header的Referer,查看配置是否正确。比如,在Chrome浏览器中按F12键,打开开发者工具,在Network中查看具体请求携带的Referer,检查与对应OSS中设置的Referer是否匹配。详情请参见如何验证OSS的Referer防盗链是否生效。
更多信息
Referer的介绍
OSS防盗链是通过Referer来实现的,所以也简称为Refer或refer,Referer详细的介绍及配置请参见防盗链。Referer相关解释与说明如下:
- 什么是Referer
Referer
是HTTP Header的一部分,表示浏览器所访问的前一个页面,可以认为是之前访问页面的链接将浏览器带到了当前页面。 - Referer的作用
- 防盗链:比如,网站访问自己的图片服务器,图片服务器取到Referer来判断是不是自己的域名,如果是就继续访问,不是则拦截。
- 数据统计:比如,统计用户是从哪个链接过来访问的。
- Referer为空
空Referer指的是HTTP请求中Referer头部的内容为空,或者HTTP请求中不包含Referer头部。如果有下面两种情况则Referer为空。- 当请求并不是由链接触发产生。比如,直接通过浏览器输入地址打开页面。
- 从HTTPS页面上的链接访问到非加密的HTTP页面时,在HTTP页面上是检查不到Referer的。
OSS防盗链配置注意事项
在设置防盗链时,需要注意以下事项,更多信息请参见设置防盗链。
- OSS防盗链配置内容包括以下两部分内容:
- 是否允许Referer字段为空的请求访问。
- Referer字段白名单。
- OSS防盗链配置中需要注意以下几点:
- 用户只有通过URL签名或者匿名访问Object时,才会做防盗链验证。如果请求Header中有
Authorization
字段时,不会做防盗链验证。 - 一个Bucket可以支持多个Referer参数,这些参数之间由
,
分隔。 - Referer参数支持通配符
*
和?
,详细解释可参考通配符说明。 - 用户可以设置是否允许Referer字段为空的请求访问。
- 白名单为空时,不会检查Referer字段是否为空(不然所有的请求都会被拒绝)。
- 白名单不为空,且设置了不允许Referer字段为空的规则,则只有Referer属于白名单的请求被允许,其它请求(包括Referer为空的请求)会被拒绝。
- 如果白名单不为空,但设置了允许Referer字段为空的规则,则Referer为空的请求和符合白名单的请求会被允许,其它请求都会被拒绝。
- Bucket的三种权限(private、public-read、public-read-write)都会检查Referer字段。
- 用户只有通过URL签名或者匿名访问Object时,才会做防盗链验证。如果请求Header中有
- 通配符说明:
- 星号
*
:代替0个或多个字符。如果正在查找以AEW开头的一个文件,但不记得文件名其余部分,可以输入AEW*
,查找以AEW开头的所有文件类型的文件,如AEWT.txt
、AEWU.EXE
、AEWI.dll
等。要缩小范围可以输入AEW*.txt
,查找以AEW开头,并以.txt
为扩展名的文件,如AEWIP.txt
、AEWDF.txt
。 - 问号
?
:代替一个字符。如果输入love?
,查找以love开头的一个字符结尾文件类型的文件,如lovey
、lovei
等。要缩小范围可以输入love?.doc
,查找以love开头,任意一个字符结尾,并以.doc
为扩展名的文件,如lovey.doc
、loveh.doc
。
- 星号
- 典型配置说明如下:
-
所有请求都可以访问。
- 空Referer:允许Referer为空。
- Referer列表:空。
-
带有规定的Referer请求或不带Referer的请求才能访问。
- 空Referer:不允许Referer为空。
- Referer列表:
http://*.oss-cn-beijing.aliyuncs.com
,http://*.aliyun.com
。
-
相关文档
其它错误的排除请参见访问OSS时出现403状态码的排查方法。
适用于
- 对象存储OSS