====================
**跨域资源共享**
====================
跨域资源共享(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。