此操作用来设置Bucket的跨域资源共享(Cross-Origin Resource Sharing,CORS)。浏览器限制脚本内发起跨源HTTP请求,即同源策略。例如,当来自于A网站的页面中的JavaScript代码希望访问B网站的时候,浏览器会拒绝该访问,因为A、B两个网站是属于不同的域。通过配置CORS,可以解决不同域相互访问的问题,CORS定义了客户端Web应用程序在一个域中与另一个域中的资源进行交互的方式。
以下是有关使用CORS的示例场景:
- 场景 1:比如用户的网站www.exam***ple.com,后端使用了OOS。在web应用中提供了使用JavaScript实现的上传文件功能,但是在该web应用中,只能向www.exam***ple.com发送请求,向其他网站发送的请求都会被浏览器拒绝。这样就导致用户上传的数据必须从www.exam***ple.com中转。如果设置了跨域访问的话,用户就可以直接上传到OOS,而无需从www.exam***ple.com中转。
- 场景2:假设用户在名为example-bucket的Bucket中托管网站,网站的Endpoint是https://example-bucket.oos-website-cn.oos-xx.ctyunapi.cn。现在,用户想要使用网页上的JavaScript (存储在此Bucket中),通过OOS API Endpoint oos-xx.ctyunapi.cn向Bucket发送GET 和 PUT 请求。浏览器通常会阻止 JavaScript 发送这些请求,但借助CORS,用户可以配置Bucket支持来自example-bucket.oos-website-cn.oos-xx.ctyunapi.cn 的跨域请求。
设置Bucket的跨域请求。如果配置已经存在,OOS会覆盖它。只有根用户和拥有PUT Bucket CORS权限的子用户才能执行此操作,否则会返回403 AccessDenied错误。在配置跨域请求时,用户可以通过XML来配置允许跨域的源和HTTP方法。XML请求体不能超过64KiB。
OOS收到来自浏览器的预检请求后,它将为Bucket评估CORS配置,并使用第一个与浏览器请求相匹配的CORSRule规则来实现跨域请求。要使规则实现匹配,必须满足以下条件:
- 请求的Origin标头必须匹配一个AllowedOrigin 元素。
- 请求方法(例如,GET 或 PUT),或者预检 OPTIONS请求中的Access-Control-Request-Method请求头,必须是某个AllowedMethod 元素。
- 在预检请求中,Access-Control-Request-Headers请求头中列出的每个请求头,必须匹配一个AllowedHeader 元素。
请求语法
PUT /?cors HTTP/1.1
Host: BucketName.oos-cn.ctyunapi.cn
Content-Length: length
Date: date
Authorization: SignatureValue
Content-MD5: MD5
<CORSConfiguration>
<CORSRule>
<AllowedOrigin>Origin you want to allow cross-domain requests from</AllowedOrigin>
<AllowedOrigin>...</AllowedOrigin>
...
<AllowedMethod>HTTP method</AllowedMethod>
<AllowedMethod>...</AllowedMethod>
...
<MaxAgeSeconds>Time in seconds your browser to cache the pre-flight OPTIONS response for a resource</MaxAgeSeconds>
<AllowedHeader>Headers that you want the browser to be allowed to send</AllowedHeader>
<AllowedHeader>...</AllowedHeader>
...
<ExposeHeader>Headers in the response that you want accessible from client application</ExposeHeader>
<ExposeHeader>...</ExposeHeader>
...
</CORSRule>
<CORSRule>
...
</CORSRule>
</CORSConfiguration>
请求参数
名称 | 描述 | 是否必须 |
---|---|---|
BucketName | 存储桶名称。 | 是 |
CORSConfiguration | 最多包含100个CORSRule元素的容器。 类型:容器。 子节点:CORSRule。 |
是 |
CORSRule | 用户允许跨域的源和方法。 类型:容器。 子节点:AllowedOrigin、AllowedMethod、AllowedHeader、MaxAgeSeconds、ExposeHeader、ID。 父节点:CORSConfiguration。 |
是 |
ID | 规则的唯一标识。最长255个字符。 类型:字符串。 父节点:CORSRule。 |
否 |
AllowedMethod | 允许跨域的HTTP方法。每个CORSRule应至少包含一个源和一个方法。 类型: 枚举 (GET, PUT, HEAD, POST, DELETE)。 父节点:CORSRule。 |
是 |
AllowedOrigin | 允许跨域的源。每个CORSRule应至少包含一个源和一个方法。 可以包含通配符*,但最多只能包含一个,比如:https://*.ctyun.cn。用户也可以只指定 * 表示允许所有源跨域访问。 类型:字符串。 父节点:CORSRule。 |
是 |
AllowedHeader | 控制在预检OPTIONS请求中Access-Control-Request-Headers头中指定的header是否允许。Access-Control-Request-Headers 中的每个请求头名称,必须在规则中有匹配的条目。 规则中的每个 AllowedHeader最多可以包含一个 * 通配符字符。例如,x-amz-*。 类型:字符串。 父节点:CORSRule。 |
否 |
MaxAgeSeconds | 指定浏览器对特定资源的预检(OPTIONS)请求返回结果的缓存时间,单位为秒。通过缓存响应,在需要重复原始请求时,浏览器无需向 OOS 发送预检请求。 一个CORSRule最多包含一个MaxAgeSeconds元素。 类型:整型。 取值:大于等于-1的整数。-1表示禁用缓存。 父节点:CORSRule。 |
否 |
ExposeHeader | 指定客户应用程序(例如,JavaScript XMLHttpRequest文件)能够访问的响应头。 类型:字符串。 父节点: CORSRule。 |
否 |
请求示例
第一个规则允许来自https://docs.oos-cn.ctyunapi.cn源的跨源 PUT、POST和DELETE请求。该规则还通过Access-Control-Request-Headers标头允许预检OPTIONS请求中的所有标头。作为对任何预检 OPTIONS 请求的响应,OOS 将返回请求的任意请求头。
第二个规则允许与第一个规则具有相同的跨源请求,但第二个规则应用于另一个源 https://example.bucket.oos-cn.ctyunapi.cn。
第三个规则允许来自所有源的跨源GET请求。“*”通配符字符是指所有的源。
PUT /?cors HTTP/1.1
Host: example-bucket.oos-cn.ctyunapi.cn
x-amz-date: Tue, 21 Aug 2012 17:54:50 GMT
Content-MD5: 8dYiLewFWZyGgV2Q5FNI4W==
Authorization: SignatureValue
Content-Length: 445
<CORSConfiguration>
<CORSRule>
<AllowedOrigin>https://docs.oos-cn.ctyunapi.cn</AllowedOrigin>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
<CORSRule>
<AllowedOrigin>https://example.bucket.oos-cn.ctyunapi.cn</AllowedOrigin>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
</CORSRule>
</CORSConfiguration>
响应示例
HTTP/1.1 200 OK
x-amz-request-id: 8859db542a32455738b2b4abadb3727479686a6c6e70727476
Date: Tue, 21 Aug 2012 17:54:50 GMT
Server:CTYUN