文档简介:
PUT Bucket cors
跨域资源共享 (Cross-Origin Resource Sharing,CORS) 定义了客户端 Web 应用程序在一个域中与另一个域中的资源进行交互的方式,是浏览器出于安全考虑而设置的一个限制,即同源策略。例如,当来自于A网站的页面中的JavaScript代码希望访问B网站的时候,浏览器会拒绝该访问,因为A、B两个网站是属于不同的域。
通过 CORS ,客户可以构建丰富的客户端 Web 应用程序,同时可以选择性地允许跨域访问OOS 资源。
以下是有关使用 CORS 的示例场景:
²场景 1:比如用户的网站www.example.com,后端使用了OOS。在web应用中提供了使用JavaScript实现的上传对象功能,但是在该web应用中,只能向www.example.com发送请求,向其他网站发送的请求都会被浏览器拒绝。这样就导致用户上传的数据必须从www.example.com中转。如果设置了跨域访问的话,用户就可以直接上传到OOS,而无需从www.example.com中转。
²场景2:假设用户在名为website 的 bucket中托管网站,网站的endpoint是 /span>
设置bucket的跨域请求。如果配置已经存在,OOS会覆盖它。只有根用户和拥有PUT Bucket CORS权限的子用户才能执行此操作,否则会返回403 AccessDenied错误。在配置跨域请求时,用户可以通过XML来配置允许跨域的源和HTTP方法。XML请求体不能超过64KB。
请求语法
PUT /?cors HTTP/1.1 Host: bucketname.oos.ctyunapi.cn Content-Length: length Date: date Authorization: authorization string 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>
|
请求元素
名称 |
描述 |
是否必需 |
CORSConfiguration |
最多包含100个CORSRules 元素的容器 类型:容器 |
是 |
CORSRule |
用户允许跨域的源和方法。 类型:容器 子节点: AllowedOrigin, AllowedMethod, MaxAgeSeconds,ExposeHeader, ID. 父节点: CORSConfiguration |
是 |
ID |
规则的唯一标示。最长255个字符。 类型:String 父节点: CORSRule |
否 |
AllowedMethod |
允许跨域的HTTP方法。每个CORSRule应至少包含一个源和一个方法。 类型: 枚举 (GET, PUT, HEAD, POST, DELETE) 父节点:CORSRule |
是 |
AllowedOrigin |
允许跨域的源。最多包含一个 * 通配符。比如:/span> 用户也可以只指定 * 表示允许所有源跨域访问。 类型: String 父节点: CORSRule |
是 |
AllowedHeader |
控制在预检OPTIONS请求中Access-Control-Request-Headers头中指定的header是否允许。Access-Control-Request-Headers 中的每个请求头名称,必须在规则中有匹配的条目。规则中的每个AllowedHeader最多可以包含一个 * 通配符字符。例如,<AllowedHeader>x-amz-*</AllowedHeader>
类型: String 父节点: CORSRule |
否 |
MaxAgeSeconds |
指定浏览器对特定资源的预检(OPTIONS)请求返回结果的缓存时间,单位为秒。通过缓存响应,在需要重复原始请求时,浏览器无需向 OOS 发送预检请求。 一个CORSRule最多包含一个MaxAgeSeconds元素。 类型: Integer (秒) 父节点: CORSRule |
否 |
ExposeHeader |
指定客户应用程序 (例如,JavaScriptXMLHttpRequest 对象) 能够访问的响应头。 类型: String 父节点: CORSRule |
否 |
请求示例
第一个规则允许来自 /span>
第二个规则允许与第一个规则具有相同的跨源请求,但第二个规则应用于另一个源 /span>
第三个规则允许来自所有源的跨源 GET 请求。“*”通配符字符是指所有的源。
PUT /?cors HTTP/1.1 Host: examplebucket.oos.ctyunapi.cn x-amz-date: Tue, 21 Aug 2012 17:54:50 GMT Content-MD5: 8dYiLewFWZyGgV2Q5FNI4W== Authorization:AWS fad0e782cd5132563e38:xQE0diMbLRepdf3YB+FIEXAMPLE= Content-Length: 445
<CORSConfiguration> <CORSRule> <AllowedOrigin>/AllowedOrigin>
<AllowedMethod>PUT</AllowedMethod> <AllowedMethod>POST</AllowedMethod> <AllowedMethod>DELETE</AllowedMethod>
<AllowedHeader>*</AllowedHeader> </CORSRule> <CORSRule> <AllowedOrigin>/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: BDC4B83DF5096BBE Date: Mon, 21 Aug 2017 17:54:50 GMT Server:CTYUN |
OOS收到来自浏览器的预检请求后,它将为bucket评估 CORS 配置,并使用第一个与浏览器请求相匹配的CORSRule规则来实现跨域请求。要使规则实现匹配,必须满足以下条件:
-
请求的Origin标头必须匹配一个AllowedOrigin 元素。
-
请求方法(例如,GET 或 PUT),或者预检 OPTIONS 请求中的Access-Control-Request-Method请求头,必须是某个 AllowedMethod 元素。
-
在预检请求中, Access-Control-Request-Headers 请求头中列出的每个请求头,必须匹配一个 AllowedHeader 元素。