更新时间:2024-02-22 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配置。
父主题: 初始化