PutBucketcors用於在指定的bucket上設定一個跨域資源共用(CORS)的規則,如果原規則存在則覆蓋原規則。

請求文法

PUT /?cors HTTP/1.1
Date: GMT Date
Content-Length:ContentLength
Content-Type: application/xml
Host: BucketName.oss-cn-hangzhou.aliyuncs.com
Authorization: SignatureValue

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration>
    <CORSRule>
      <AllowedOrigin>the origin you want allow CORS request from</AllowedOrigin>
      <AllowedOrigin>…</AllowedOrigin>
      <AllowedMethod>HTTP method</AllowedMethod>
      <AllowedMethod>…</AllowedMethod>
        <AllowedHeader> headers that allowed browser to send</AllowedHeader>
          <AllowedHeader>…</AllowedHeader>
          <ExposeHeader> headers in response that can access from client app</ExposeHeader>
          <ExposeHeader>…</ExposeHeader>
          <MaxAgeSeconds>time to cache pre-fight response</MaxAgeSeconds>
    </CORSRule>
    <CORSRule>
      …
    </CORSRule>
…
</CORSConfiguration >

請求元素(Request Elements)

名稱 類型 描述 是否必須
CORSRule 容器 CORS規則的容器,每個bucket最多允許10條規則

父節點:CORSConfiguration

AllowedOrigin 字元串 指定允許的跨域請求的來源,允許使用多個元素來指定多個允許的來源。 允許使用最多一個“*”萬用字元。如果指定為“*”則表示允許所有的來源的跨域請求。

父節點:CORSRule

AllowedMethod 枚舉(GET,PUT,DELETE,POST,HEAD) 指定允許的跨域要求方法。

父節點:CORSRule

AllowedHeader 字元串 控制在OPTIONS預取指令中Access-Control-Request-Headers頭中指定的header是否允許。在Access-Control-Request-Headers中指定的每個header都必須在AllowedHeader中有一條對應的項。允許使用最多一個“*”萬用字元 。

父節點:CORSRule

ExposeHeader 字元串 指定允許用戶從應用程式中訪問的回應標頭(例如一個Javascript的XMLHttpRequest對象。)不允許使用“*”萬用字元。

父節點:CORSRule

MaxAgeSeconds 整型 指定瀏覽器對特定資源的預取(OPTIONS)請求返回結果的緩存時間,單位為秒。 一個CORSRule裡面最多允許出現一個。

父節點:CORSRule

CORSConfiguration 容器 Bucket的CORS規則容器

父節點:無

細節分析

  • 預設bucket是不開啟CORS功能,所有的跨域請求的origin都不被允許。
  • 為了在應用程式中使用CORS功能,比如從一個www.a.com的網址通過瀏覽器的XMLHttpRequest功能來訪問OSS,需要通過本介面手動上傳CORS規則來開啟。該規則由XML文檔來描述。
  • 每個bucket的CORS設定是由多條CORS規則指定的,每個bucket最多允許10條規則,上傳的XML文檔最多允許16KB大小。
  • 當OSS收到一個跨域請求(或者OPTIONS請求),會讀取bucket對應的CORS規則,然後進行相應的許可權檢查。OSS會依次檢查每一條規則,使用第一條匹配的規則來允許請求並返回對應的header。如果所有規則都匹配失敗則不附加任何CORS相關的header。
  • CORS規則匹配成功必須滿足三個條件,首先,請求的Origin必須匹配一項AllowedOrigin項,其次,請求的方法(如GET,PUT等)或者OPTIONS請求的Access-Control-Request-Method頭對應的方法必須匹配一項AllowedMethod項,最後,OPTIONS請求的Access-Control-Request-Headers頭包含的每個header都必須匹配一項AllowedHeader項。
  • 如果用戶上傳了Content-MD5要求標頭,OSS會計算body的Content-MD5並檢查一致性,如果不一致,將返回InvalidDigest錯誤碼。

樣本

添加bucket跨域訪問請求規則樣本:

PUT /?cors HTTP/1.1
Host: oss-example.oss-cn-hangzhou.aliyuncs.com
Content-Length: 186
Date: Fri, 04 May 2012 03:21:12 GMT
Authorization: OSS qn6qrrqxo2oawuk53otfjbyc:KU5h8YMUC78M30dXqf3JxrTZHiA=

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration>
    <CORSRule>
      <AllowedOrigin>*</AllowedOrigin>
      <AllowedMethod>PUT</AllowedMethod>
      <AllowedMethod>GET</AllowedMethod>
      <AllowedHeader>Authorization</AllowedHeader>
    </CORSRule>
    <CORSRule>
      <AllowedOrigin>http://www.a.com</AllowedOrigin>
      <AllowedOrigin>http://www.b.com</AllowedOrigin>
      <AllowedMethod>GET</AllowedMethod>
      <AllowedHeader> Authorization</AllowedHeader>
      <ExposeHeader>x-oss-test</ExposeHeader>
      <ExposeHeader>x-oss-test1</ExposeHeader>
      <MaxAgeSeconds>100</MaxAgeSeconds>
    </CORSRule>
</CORSConfiguration >

返回樣本:

HTTP/1.1 200 OK
x-oss-request-id: 50519080C4689A033D00235F
Date: Fri, 04 May 2012 03:21:12 GMT
Content-Length: 0
Connection: keep-alive
Server: AliyunOSS