==================== **跨域资源共享** ==================== 跨域资源共享(CORS)允许WEB端的应用程序访问不属于本域的资源。NOS提供了CORS支持以方便利用NOS开发更灵活的WEB应用程序。NOS提供接口方便开发者控制跨域访问的各种权限。 Put Bucket cors ================== 描述 -------- Put Bucket cors操作将在指定的bucket上设定一个跨域资源共享(CORS)的规则,如果原规则存在则覆盖原规则。 请求语法 ----------- .. code:: PUT /?cors HTTP/1.1 Host: ${BucketName}.${endpoint} Content-Length: ${length} Date: ${date} Authorization: ${signature} Content-MD5: ${md5} the origin you want allow CORS request from HTTP method headers that allowed browser to send headers in response that can access from client app time to cache pre-fight response 请求参数 ------------ .. list-table:: :widths: 10 35 10 :header-rows: 1 * - 参数 - 描述 - 是否必须 * - CORSConfiguration - | Bucket的CORS规则容器,可以指定1-10条CORS规则 | 类型:容器 | 默认:无 - Yes * - CORSRule - | CORS规则 | 类型:容器 | 默认:无 - Yes * - AllowedOrigin - | 指定允许的跨域请求的来源,多个则以逗号分隔。每个来源字符串中允许使用最多一个‘*’通配符。如果来源指定为“*”则表示允许所有的来源的跨域请求。 | 类型:非空字符串 - Yes * - AllowedMethod - | 指定允许的跨域请求方法。 | 类型:枚举(GET,PUT,DELETE,POST,HEAD),多个则以逗号分隔 | 默认:无 - Yes * - AllowedHeader - | 逗号分隔的header列表,控制在OPTIONS预取指令中Access-Control-Request-Headers头中指定的header是否允许。在Access-Control-Request-Headers中指定的每个header都必须在AllowedHeader中有一条对应的项。AllowedHeader的中的header值允许使用最多一个‘*’通配符。 | 类型:类型:非空字符串 | 默认:无 - No * - ExposeHeader - | 指定允许用户从应用程序中访问的响应头(例如一个Javascript的XMLHttpRequest对象。)不允许使用‘*’通配符。 | 类型:类型:非空字符串 | 默认:无 - No * - MaxAgeSeconds - | 指定浏览器对特定资源的预取(OPTIONS)请求返回结果的缓存时间,单位为秒。 | 类型:整型 | 默认:无 - No 示例 -------- Request .. code:: PUT /?cors HTTP/1.1 Host: dream.nos-eastchina1.126.net Content-Length: 186 Date: Fri, 04 May 2016 03:21:12 GMT Authorization: NOS I_AM_ACCESS_ID:I_AM_SIGNATURE * PUT Authorization http://www.a.com,http://www.b.com GET Authorization x-nos-test,x-nos-test1 100 Response .. code:: HTTP/1.1 200 OK x-nos-request-id: 17b21e42ac11000001390ab891440240 Date: Wed, 01 Mar 2012 21:34:55 GMT Connection: close Server: NOS 细节描述 ------------ 1) 为了在应用程序中使用CORS功能,比如从一个www.a.com的网址通过浏览器的XMLHttpRequest功能来访问NOS,需要通过本接口上传CORS规则来开启。 2) 每个bucket的CORS设定是由多条CORS规则指定的,每个bucket最多允许10条规则,上传的XML文档最多允许16KB大小。 3) 当NOS收到一个跨域请求(或者OPTIONS请求),会读取bucket对应的CORS规则,然后进行相应的权限检查。NOS会依次检查每一条规则,使用第一条匹配的规则来允许请求并返回对应的header。如果所有规则都匹配失败则不附加任何CORS相关的header。 4) CORS规则匹配成功必须满足三个条件,首先,请求的Origin必须匹配一项AllowedOrigin值,其次,请求的方法(如GET,PUT等)或者OPTIONS请求的Access-Control-Request-Method头对应的方法必须匹配一项AllowedMethod值,最后,OPTIONS请求的Access-Control-Request-Headers头包含的每个header都必须匹配一项AllowedHeader值。 Get Bucket cors ========================= 描述 ------ Get Bucket cors操作用于获取指定的Bucket目前的CORS规则,返回PUT Bucket cors请求的body。 语法 ------- .. code:: GET /?cors HTTP/1.1 Host: ${BucketName}.{endpoint} Content-Length: ${length} Date: ${date} Authorization: ${signature} 响应元素 ------------- 与Put Bucket cors的请求元素一致。 示例 ----- Request .. code:: GET /cors HTTP/1.1 HOST: dream.nos-eastchina1.126.net Date: Wed, 01 Mar 2012 21:34:55 GMT Authorization: NOS I_AM_ACCESS_ID:I_AM_SIGNATURE Response .. code:: HTTP/1.1 200 {origin} {method} {header} {exposeheader} {age} ... ... 细节描述 ---------- 1) 如果CORS规则不存在,返回404 Not Found错误,错误码NoSuchCORSConfiguration。 Delete Bucket cors ====================== 描述 ------- Delete Bucket cors用于关闭指定Bucket对应的CORS功能并清空所有规则。 语法 ------- .. code:: DELETE /?cors HTTP/1.1 Host: ${BucketName}.{endpoint} Date: ${date} Authorization: ${signature} 示例 ------ Request .. code:: DELETE /?cors HTTP/1.1 HOST: dream.nos-eastchina1.126.net Date: Wed, 01 Mar 2012 21:34:55 GMT Authorization: NOS I_AM_ACCESS_ID:I_AM_SIGNATURE Response .. code:: HTTP/1.1 200 OK x-nos-request-id: 17b21e42ac11000001390ab891440240 Date: Wed, 01 Mar 2012 21:34:55 GMT x-nos-acl: private Connection: close Server: NOS OPTIONS Object =================== 描述 ---- 对于非简单跨域请求,浏览器在发送跨域请求之前会发送一个preflight请求(OPTIONS)并带上特定的来源域、HTTP方法和header信息等给NOS以决定是否发送真正的请求。 NOS可以通过Put Bucket cors接口来开启Bucket的CORS支持,开启CORS功能之后,NOS在收到浏览器preflight请求时会根据设定的规则评估是否允许本次请求。如果不允许或者CORS功能没有开启,返回403 Forbidden。 语法 ---- .. code:: OPTIONS /ObjectName HTTP/1.1 Date: ${date} Host: ${BucketName}.{endpoint} Origin: origin Access-Control-Request-Method: HTTP method Access-Control-Request-Headers: Request Headers 请求头 -------- .. list-table:: :widths: 10 35 10 :header-rows: 1 * - 元素 - 描述 - 是否必须 * - Origin - | 请求来源域,用来标示跨域请求。 | 类型:字符串 | 默认:无 - Yes * - Access-Control-Request-Method - | 表示在实际请求中将会用到的方法。 | 类型:字符串 | 默认:无 - Yes * - Access-Control-Request-Headers - | 表示在实际请求中会用到的除了简单头部之外的headers,多个header则逗号分隔,大小写不敏感。 | 类型:字符串 - No 响应头 -------- 返回200 OK时,携带如下响应消息头: .. list-table:: :widths: 10 35 10 :header-rows: 1 * - 元素 - 描述 - 是否必须 * - Access-Control-Allow-Origin - | 请求中的Origin值,如果不允许的话将不包含该头部。 | 类型:字符串 - Yes * - Access-Control-Allow-Methods - | 允许请求的HTTP方法,返回请求中Access-Control-Request-Method的值。如果不允许该请求,则不包含该头部。 | 类型:字符串 - Yes * - Access-Control-Allow-Headers - | 允许请求携带的header的列表,逗号分隔,如果请求中有不被允许的header,则不包含该头部,请求也将被拒绝。 | 类型:字符串 - 返回请求中Access-Control-Request-Headers的值(若有) * - Access-Control-Expose-Headers - | 允许在客户端JavaScript程序中访问的headers的列表,逗号分隔。返回匹配到的CORS规则的ExposeHeader。 | 类型:字符串 - 有则返回 * - Access-Control-Max-Age - | 允许浏览器缓存preflight结果的时间,单位为秒。返回匹配到的CORS规则的MaxAgeSeconds。 | 类型:整型 - 有则返回 示例 ---- Request .. code:: OPTIONS /testobject HTTP/1.1 Host: dream.nos-eastchina1.126.net Date: Fri, 24 Feb 2012 05:45:34 GMT Origin:http://www.example.com Access-Control-Request-Method:PUT Access-Control-Request-Headers:x-nos-token Response .. code:: HTTP/1.1 200 OK Access-Control-Allow-Origin: http://www.example.com Access-Control-Allow-Methods: PUT Access-Control-Expose-Headers: x-nos-token 细节描述 -------- 1) 桶不存在时,返回404,错误码NOSuchBucket。