Put Bucket Cors

Put Bucket cors 操作将在指定的 bucket 上设定一个跨域资源共享(CORS)的规则,如果原规则存在则覆盖原规则。

请求语法

PUT /mss-test-bucket/?cors HTTP/1.1
Authorization: authorization string
Content-Length: length
Date: GMT Date
Host: mtmss.com

<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>

请求参数(Request Parameters)

名称 描述 是否必须
CORSConfiguration Bucket的CORS规则容器
类型:容器
父节点:无
CORSRule CORS规则的容器
类型:容器
父节点:CORSConfiguration
AllowedOrigin 指定允许的跨域请求的来源,允许使用多个元素来指定多个允许的来源。 允许使用最多一个“”通配符。如果指定为“”则表示允许所有的来源的跨域请求。
类型:字符串
父节点:CORSRule
AllowedMethod 指定允许的跨域请求方法。
类型:枚举(GET,PUT,DELETE,POST,HEAD)
父节点:CORSRule
AllowedHeader 控制在OPTIONS预取指令中Access-Control-Request-Headers头中指定的header是否允许。在Access-Control-Request-Headers中指定的每个header都必须在AllowedHeader中有一条对应的项。允许使用最多一个“*”通配符
类型:字符串
父节点:CORSRule
MaxAgeSeconds 指定浏览器对特定资源的预取(OPTIONS)请求返回结果的缓存时间,单位为秒。 一个CORSRule里面最多允许出现一个。
类型:整型
父节点:CORSRule
ExposeHeader 指定允许用户从应用程序中访问的响应头(例如一个Javascript的XMLHttpRequest对象。)不允许使用“*”通配符。
类型:字符串
父节点:CORSRule

细节分析

  1. 默认 bucket 是不开启 CORS 功能,所有的跨域请求的 origin 都不被允许。
  2. 为了在应用程序中使用 CORS 功能,比如从一个 www.a.com 的网址通过浏览器的 XMLHttpRequest 功能来访问 MSS,需要通过本接口手动上传 CORS 规则来开启。该规则由 XML 文档来描述。
  3. CORS 规则匹配成功必须满足三个条件,首先,请求的 Origin 必须匹配一项 AllowedOrigin 项,其次,请求的方法(如 GET,PUT 等)或者 OPTIONS 请求的 Access-Control-Request-Method 头对应的方法必须匹配一项 AllowedMethod 项,最后,OPTIONS 请求的 Access-Control-Request-Headers 头包含的每个 header 都必须匹配一项 AllowedHeader 项。
  4. 当 MSS 收到一个跨域请求(或者 OPTIONS 请求),会读取 bucket 对应的 CORS 规则,然后进行相应的权限检查。MSS 会依次检查每一条规则,使用第一条匹配的规则来允许请求并返回对应的 header。如果所有规则都匹配失败则不附加任何 CORS 相关的 header。

示例

请求示例:

PUT /mss-test-bucket/?cors HTTP/1.1
Accept: application/xml
Accept-Encoding: gzip, deflate
Authorization: AWS 825a6cb3cbfb438b89e28fb66a944e19:zEXSjHUhaY7f8joVoeJ6mnDBIr0=
Connection: keep-alive
Content-Length: 443
content-md5: QjuX/HM8he+eOuSauWMPcQ==
Date: Wed, 08 Nov 2017 05:50:54 GMT
Host: mtmss.com

<CORSConfiguration>
 <CORSRule>
   <AllowedOrigin>http://www.example1.com</AllowedOrigin>
   <AllowedMethod>*</AllowedMethod>
   <AllowedHeader>*</AllowedHeader>
 </CORSRule>
 <CORSRule>
   <AllowedOrigin>http://www.example2.com</AllowedOrigin>
   <AllowedMethod>GET</AllowedMethod>
   <AllowedMethod>POST</AllowedMethod>
   <AllowedMethod>DELETE</AllowedMethod>
   <AllowedHeader>*</AllowedHeader>
 </CORSRule>
</CORSConfiguration>

返回示例:

HTTP/1.1 200 OK
Server: Tengine
Date: Wed, 08 Nov 2017 06:15:51 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 0
Connection: keep-alive
X-Amz-Id-2: 8c994c82ae2b5ec2b377707594f047d4
X-Amz-Request-Id: 1510121751365670
X-Mss-Trace-Id: 310188033968522053

Get Bucket Cors

Get Bucket cors操作用于获取指定的Bucket目前的CORS规则。

请求语法

GET /mss-test-bucket/?cors HTTP/1.1
Authorization: authorization string
Date: GMT Date
Host: mtmss.com

响应元素(Response Elements)

名称 描述
CORSConfiguration Bucket 的 CORS 规则容器
类型:容器
父节点:无
CORSRule CORS 规则的容器
类型:容器
父节点:CORSConfiguration
AllowedOrigin 指定允许的跨域请求的来源,允许使用多个元素来指定多个允许的来源。 允许使用最多一个“*”通配符。如果指定为“*”则表示允许所有的来源的跨域请求。
类型:字符串
父节点:CORSRule
AllowedMethod 指定允许的跨域请求方法。
类型:枚举(GET,PUT,DELETE,POST,HEAD)
父节点:CORSRule
AllowedHeader 控制在 OPTIONS 预取指令中 Access-Control-Request-Headers 头中指定的 header 是否允许。在 Access-Control-Request-Headers 中指定的每个 header 都必须在 AllowedHeader 中有一条对应的项。允许使用最多一个“*”通配符
类型:字符串
父节点:CORSRule
MaxAgeSeconds 指定浏览器对特定资源的预取(OPTIONS)请求返回结果的缓存时间,单位为秒。 一个 CORSRule 里面最多允许出现一个。
类型:整型
父节点:CORSRule
ExposeHeader 指定允许用户从应用程序中访问的响应头(例如一个 Javascript 的 XMLHttpRequest 对象。)不允许使用“*”通配符。
类型:字符串
父节点:CORSRule

示例

请求示例:

GET /mss-test-bucket/?cors HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Authorization: AWS 825a6cb3cbfb438b89e28fb66a944e19:u8sMYhNnaiUfM4ZOFsf7UUBImE4=
Connection: keep-alive
Date: Fri, 24 Nov 2017 09:18:38 GMT
Host: mtmss.com

返回示例:

HTTP/1.1 200 OK
Server: Tengine
Date: Fri, 24 Nov 2017 09:16:19 GMT
Content-Type: application/xml; charset=utf-8
Content-Length: 391
Connection: keep-alive
X-Amz-Id-2: c6c6c11d21f373e51af4b369cc17b7df
X-Amz-Request-Id: 1511514979102755
X-Ms-Trans-Id: 34316b4a9e8b747113019eb526974a3c-1511514979102768
X-Mss-Trace-Id: 310194632431516446

<CORSConfiguration>
    <CORSRule>
        <AllowedOrigin>http://www.example1.com</AllowedOrigin>
        <AllowedMethod>*</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
    <CORSRule>
        <AllowedOrigin>http://www.example2.com</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>DELETE</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

Delete Bucket Cors

Put Bucket cors操作将在指定的bucket上设定一个跨域资源共享(CORS)的规则,如果原规则存在则覆盖原规则。

请求语法

DELETE /mss-test-bucket/?cors HTTP/1.1
Authorization: authorization string
Date: GMT Date
Host: mtmss.com

细节分析

  1. 如果 Bucket 不存在,返回 404 错误,错误码:NoSuchBucket。
  2. 只有 Bucket 的拥有者才能删除 Bucket 对应的 CORS 规则。如果试图操作一个不属于你的 Bucket,MSS 返回 403 Forbidden错误,错误码:AccessDenied。

示例

请求示例:

DELETE /mss-test-bucket/?cors HTTP/1.1
Authorization: AWS 825a6cb3cbfb438b89e28fb66a944e19:zEXSjHUhaY7f8joVoeJ6mnDBIr0=
Connection: keep-alive
Date: Wed, 08 Nov 2017 05:50:54 GMT
Host: mtmss.com

返回示例:

HTTP/1.1 204 No Content
Server: Tengine
Date: Wed, 08 Nov 2017 06:15:51 GMT
Connection: keep-alive
X-Amz-Id-2: 8c994c82ae2b5ec2b377707594f047d4
X-Amz-Request-Id: 1510121751365670
X-Mss-Trace-Id: 310188033968522053

Options Object

浏览器在发送跨域请求之前会发送一个 preflight 请求(OPTIONS)并带上特定的来源域(origin),HTTP method 和 header 信息等给 MSS 以决定是否发送真正的请求。MSS 可以通过 Put Bucket cors 接口来开启 Bucket 的 CORS 支持,开启 CORS 功能之后,MSS 在收到浏览器 preflight 请求时会根据设定的规则评估是否允许本次请求。如果不允许或者CORS 功能没有开启,返回 403 Forbidden。

请求语法

OPTIONS /mss-test-bucket/my-obj HTTP/1.1
Host: mtmss.com
Date: Wed, 28 Oct 2009 22:32:00 GMT
Authorization: authorization string
Origin: Origin
Access-Control-Request-Method: HTTPMethod
Access-Control-Request-Headers: RequestHeader

请求头部

名称 描述 是否必须
Origin 标识跨域请求的域。例如 http://www.example.com/。
类型:字符串
默认值:无
Access-Control-Request-Method 标识实际请求的 HTTP method。
类型:字符串
默认值:无
Access-Control-Request-Headers 将在实际请求中发送的HTTP头的逗号分隔列表,用以判断请求能否包含该头。
类型:字符串
默认值:无

响应头部

名称 描述
Access-Control-Allow-Origin 请求发送的 origin。如果请求中的 origin 不被允许,响应时不会携带这个头。
类型: 字符串
Access-Control-Allow-Methods 原始请求的 HTTP method。如果请求 method 不被允许,响应时不会携带这个头。
类型: 字符串
Access-Control-Allow-Headers 浏览器可以在实际请求中发送的 HTTP 头的逗号分隔列表。 如果任何请求的头不被允许,那么 MSS 将不在响应中包含该头,响应也不会包含任何带有访问控制前缀的头。
类型:字符串
Access-Control-Expose-Headers 以逗号分隔的 HTTP 头列表。 这个头为 JavaScript 客户端提供响应实际请求时对这些头的访问。如果请求不被允许,响应时不会携带这个头。
类型:字符串
Access-Control-Max-Age 预请求的结果能被缓存的时间,以秒计。如果请求不被允许,响应时不会携带这个头。
类型: 字符串

细节分析

  1. 如果 Origin 或者 Access-Control-Request-Method 为空、或者请求不被允许,返回 403Forbidden。

示例

请求示例: 浏览器可以将此预请求发送到 MSS,以确定它是否可以将来自 http://www.example.com 源的实际 PUT 请求发送到 MSS 名为 mss-test-bucket 的存储桶。

OPTIONS /mss-test-bucket/my-obj HTTP/1.1
Host: mtmss.com
Date: Wed, 28 Oct 2009 22:32:00 GMT
Authorization: authorization string
Origin: http://www.example.com
Access-Control-Request-Method: PUT

响应示例:

HTTP/1.1 200 OK
Date: Wed, 21 Aug 2012 23:09:55 GMT
Etag: "fba9dede5f27731c9771645a39863328"
Access-Control-Allow-Origin: http://www.example.com
Access-Control-Allow-Methods: PUT
Access-Control-Expose-Headers: x-amz-request-id
Content-Length: 0
Server: MeituanStorageService
X-Amz-Id-2: bb23c316f37ac11e3455df7d6b041a7e
X-Amz-Request-Id: 1511335933303653
X-Mss-Trace-Id: 1175465203335443831