CORS

cross origin resource share

简单的请求

有些请求不会触发CORS预检。这些在本文中被称为“简单请求”,尽管Fetch规范(它定义了CORS)不使用该术语。不会触发CORS预检的请求(所谓的“简单请求”)是满足以下所有条件的请求:

唯一允许的方法是:

  • GET
  • HEAD
  • POST

    CORS安全列表请求标头

    除了由用户代理自动设置的标头(例如,Connection,User-Agent,或任何与所述抓取规格为“禁止的标题名称”定义名称其它标题的),其允许被手动设置仅标头是那些Fetch规范将其定义为“CORS安全列表请求标头”,它们是:

  • Accept
  • Accept-Language
  • Content-Language
  • Content-Type (但请注意下面的附加要求)
  • Last-Event-ID
  • DPR
  • Downlink
  • Save-Data
  • Viewport-Width
  • Width

    Content-Type标题的唯一允许值是:

  • application/x-www-form-urlencoded

  • multipart/form-data

  • text/plain

没有事件侦听器XMLHttpRequestUpload在请求中使用的任何对象上注册。

ReadableStream请求中没有使用对象。

预先请求的请求

与上面讨论的“简单请求”不同,“preflighted”请求首先通过OPTIONS方法向另一个域上的资源发送HTTP请求,以确定实际请求是否安全发送。 跨站请求是这样预检的,因为它们可能会影响用户数据。

特别是,如果满足以下任一条件,则会请求一个请求:

如果请求使用以下任何一种方法:

  • PUT
  • DELETE
  • CONNECT
  • OPTIONS
  • TRACE
  • PATCH

如果,除了由用户代理自动设置的标头(例如,Connection,User-Agent,或任何与所述抓取规格为“禁止的标题名称”中定义的名称其它头的),该请求包括比其他任何头那些Fetch规范将其定义为“CORS安全列表请求标头”,参考上面

如果该Content-Type头具有如下的以外值:

  • application/x-www-form-urlencoded
  • multipart/form-data
  • text/plain

如果XMLHttpRequestUpload在请求中使用的对象上注册了一个或多个事件侦听器。

或者如果ReadableStream请求中使用了对象。

预检响应

Access-Control-Max-Age给出以秒为单位的值, 这个响应头表示 preflight request(预检请求)的返回结果(即 Access-Control-Allow-Methods 和Access-Control-Allow-Headers 提供的信息) 可以被缓存多久。 Access-Control-Max-Age: 返回结果可以被缓存的最长时间(秒)。 delta-seconds: 在 Firefox 中,上限是24小时 (即 86400 秒)。 在 Chromium v76 之前, 上限是 10 分钟(即 600 秒)。 从 Chromium v76 开始,上限是 2 小时(即 7200 秒)。 Chromium 同时规定了一个默认值 5 秒。 如果值为 -1,表示禁用缓存,则每次请求前都需要使用 OPTIONS 预检请求。