BAE BCS 的后台没有设置防盗链的地方,需要通过API 的set_acl 设置,官方文档说得比较含糊。下面是一个可行代码。
环境是python,php 原理也一样。
首先看看官方给的示例。
对多文件设置防盗链
可通过对Bucket设置相关Policy,实现对多文件进行防盗链设置。
1
2
3
4
5
6
7
8
9
10
11
{"statements":
[
{
"action":["get_object"],
"effect":"allow",
"resource":["public-demo/"],
"user":["*"],
"referer":["http://www.baidu.com/*"]
}
]
}
上述Policy可实现:
如果访问请求来自于referer所指定的 www.baidu.com ,则允许其对public-demo bucket中的所有存储对象进行get_object操作。
你可以先通过get_acl 获取原来cal 的内容,对比一下其实是多了这个属性
1
"referer":["http://www.baidu.com/*"]
下面是python 的实现代码:
1
2
3
4
5
6
7
8
def set_bucket_referer():
"""
对一个 bucket 设置防盗链,只需运行一次
"""
acl_referer = '{"statements":[{"action":["*"],"effect":"allow","resource":["%s\\/"],"user":["*"],"referer":["http:\/\/%s\/*"]}]}' % (BUCKET, MAJOR_DOMAIN)
from bae.api import bcs
mybcs = bcs.BaeBCS(BCSHOST, AK, SK)
mybcs.set_acl(BUCKET, "", acl_referer)
其中MAJOR_DOMAIN是主域名,也可以多加几个域名。
图片防盗链测试:深圳西冲海滩日出