更新时间:2024-12-03 GMT+08:00
配置桶的CORS
由于OBS以桶为单位提供基于HTTP/HTTPS协议的分布式存储服务,而浏览器默认不允许Ajax跨域请求,因此使用OBS BrowserJS SDK访问桶前必须配置该桶的CORS。您可以通过OBS Console、OBS Browser或者除OBS BrowserJS SDK外的其他OBS SDK三种途径配置桶的CORS,推荐为桶的CORS配置的规则如下:
|
配置项 |
配置值 |
说明 |
|---|---|---|
|
AllowedOrigin |
* |
允许任意请求来源。
说明:
也可以配置具体的域名或IP。 |
|
AllowedMethod |
PUT、GET、POST、DELETE、HEAD |
允许所有的HTTP方法。 |
|
AllowedHeader |
* |
允许请求中携带任意头域。 |
|
ExposeHeader |
|
允许响应中返回指定的附加头域。
须知:
附加头域:指定浏览器可以暴露给客户端的响应消息头。 比如在浏览器环境中,需要获取ETag值,由于ETag不属于标准响应头,就需要添加到扩展头域。 |
通过OBS Console配置桶的CORS
- 登录OBS Console后在桶列表中,单击待操作的桶,进入“概览”页面;如下图所示

- 在“基础配置”下,单击“CORS规则”卡片,进入“CORS规则”界面。
- 在“CORS规则”界面,单击“创建”,系统弹出“创建CORS规则”对话框,在该对话框中按照上表的参数进行配置,如下图所示:

- 单击“确定”,并在“CORS规则”界面查看已配置好的规则。
桶的CORS配置会在两分钟内生效,生效后才能使用OBS BrowserJS SDK访问桶。
通过OBS Java SDK配置桶的CORS
您可以使用OBS Java SDK调用ObsClient.setBucketCors接口配置桶的CORS,示例代码如下:
// Endpoint以中国-香港为例,其他地区请按实际情况填写。
String endPoint = "https://obs.ap-southeast-1.myhuaweicloud.com";
String ak = System.getenv("ACCESS_KEY_ID");
String sk = System.getenv("SECRET_ACCESS_KEY_ID");
// 创建ObsClient实例
ObsClient obsClient = new ObsClient(ak, sk, endPoint);
BucketCors cors = new BucketCors();
List<BucketCorsRule> rules = new ArrayList<BucketCorsRule>();
BucketCorsRule rule = new BucketCorsRule();
// 指定允许跨域请求的来源
ArrayList<String> allowedOrigin = new ArrayList<String>();
allowedOrigin.add( "*");
rule.setAllowedOrigin(allowedOrigin);
// 指定允许跨域请求的方法
ArrayList<String> allowedMethod = new ArrayList<String>();
allowedMethod.add("GET");
allowedMethod.add("POST");
allowedMethod.add("PUT");
allowedMethod.add("DELETE");
allowedMethod.add("HEAD");
rule.setAllowedMethod(allowedMethod);
// 指定允许跨域请求的头域
ArrayList<String> allowedHeader = new ArrayList<String>();
allowedHeader.add("*");
rule.setAllowedHeader(allowedHeader);
// 指定允许跨域请求的响应中的附加头域
ArrayList<String> exposeHeader = new ArrayList<String>();
exposeHeader.add("ETag");
exposeHeader.add("Content-Type");
exposeHeader.add("Content-Length");
exposeHeader.add("Cache-Control");
exposeHeader.add("Content-Disposition");
exposeHeader.add("Content-Encoding");
exposeHeader.add("Content-Language");
exposeHeader.add("Expires");
exposeHeader.add("x-obs-request-id");
exposeHeader.add("x-obs-id-2");
exposeHeader.add("x-reserved-indicator");
exposeHeader.add("x-obs-api");
exposeHeader.add("x-obs-version-id");
exposeHeader.add("x-obs-copy-source-version-id");
exposeHeader.add("x-obs-storage-class");
exposeHeader.add("x-obs-delete-marker");
exposeHeader.add("x-obs-expiration");
exposeHeader.add("x-obs-website-redirect-location");
exposeHeader.add("x-obs-restore");
exposeHeader.add("x-obs-version");
exposeHeader.add("x-obs-object-type");
exposeHeader.add("x-obs-next-append-position");
rule.setExposeHeader(exposeHeader);
rule.setMaxAgeSecond(100);
rules.add(rule);
cors.setRules(rules);
try
{
obsClient.setBucketCors("bucketname", cors);
catch (ObsException e)
{
System.out.println("HTTP Code: " + e.getResponseCode());
System.out.println("Error Code:" + e.getErrorCode());
System.out.println("Error Message: " + e.getErrorMessage());
System.out.println("Request ID:" + e.getErrorRequestId());
System.out.println("Host ID:" + e.getErrorHostId());
}
}
通过OBS Python SDK配置桶的CORS
您可以使用OBS Python SDK调用ObsClient.setBucketCors接口配置桶的CORS,示例代码如下:
# 引入模块
from obs import ObsClient
# 推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
# 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/intl/zh-cn/usermanual-ca/ca_01_0003.html。
ak = os.getenv("AccessKeyID")
sk = os.getenv("SecretAccessKey")
# 【可选】如果使用临时AKSK和SecurityToken访问OBS,则同样推荐通过环境变量获取
security_token = os.getenv("SecurityToken")
# server填写Bucket对应的Endpoint, 这里以中国-香港为例,其他地区请按实际情况填写。
server = "https://obs.ap-southeast-1.myhuaweicloud.com"
# 创建obsClient实例
# 如果使用临时AKSK和SecurityToken访问OBS,需要在创建实例时通过security_token参数指定securityToken值
obsClient = ObsClient(access_key_id=ak, secret_access_key=sk, server=server)
from obs import CorsRule
# 指定允许跨域请求的来源
allowedOrigin = ['*']
# 指定允许跨域请求的方法
allowedMethod = ['PUT', 'POST', 'GET', 'DELETE', 'HEAD']
# 指定允许跨域请求的头域
allowedHeader = ['*']
# 指定允许跨域请求的响应中的附加头域
exposeHeader = ['ETag', 'Content-Type', 'Content-Length', 'Cache-Control', 'Content-Disposition', 'Content-Encoding', 'Content-Language', 'Expires', 'x-obs-request-id', 'x-obs-id-2', 'x-reserved-indicator', 'x-obs-api', 'x-obs-version-id', 'x-obs-copy-source-version-id', 'x-obs-storage-class', 'x-obs-delete-marker', 'x-obs-expiration', 'x-obs-website-redirect-location', 'x-obs-restore', 'x-obs-version', 'x-obs-object-type', 'x-obs-next-append-position']
maxAgeSecond = 100
cors = CorsRule(id='rule1', allowedMethod=allowedMethod,
allowedOrigin=allowedOrigin, allowedHeader=allowedHeader,
maxAgeSecond=maxAgeSecond, exposeHeader=exposeHeader)
resp = obsClient.setBucketCors('bucketname', corsList=[cors])
if resp.status < 300:
print('requestId:', resp.requestId)
else:
print('errorCode:', resp.errorCode)
print('errorMessage:', resp.errorMessage)
- 除OBS BrowserJS SDK外,其他语言的OBS SDK均支持配置桶的CORS;
- 您也可以参考OBS Console配置跨域资源共享或者各SDK语言开发指南的配置CORS规则章节,完成桶的CORS配置。
父主题: 初始化