OPTIONS预检请求(preflight request)
跨域的情况下,发起的非简单请求,浏览器会发送Options请求,从而获知服务端是否允许该跨源请求。服务器确认允许之后,才发起实际的 HTTP 请求。
简单请求的定义:
- 使用下列方法之一:
- GET
- HEAD
- POST
- 除了被用户代理自动设置的首部字段(例如 Connection,User-Agent)和在 Fetch 规范中定义为 禁用首部名称 的其他首部,允许人为设置的字段为 Fetch 规范定义的 对 CORS 安全的首部字段集合。该集合为:
- Accept
- Accept-Language
- Content-Language
- Content-Type(需要注意额外的限制)
- Content-Type 的值仅限于下列三者之一:
- text/plain
- multipart/form-data
- application/x-www-form-urlencoded
- 请求中的任意 XMLHttpRequest 对象均没有注册任何事件监听器;XMLHttpRequest 对象可以使用 XMLHttpRequest.upload 属性访问。
- 请求中没有使用 ReadableStream 对象。
避免OPTIONS preflight request
请求量大时,浪费流量,也增加日志开销。有几种方式规避:
- 改变请求为简单请求
- 响应header设置 Access-Control-Max-Age 缓存预检请求
- 从负载均衡层(如Nginx)直接返回204(不推荐)
关联文档
手动发起OPTIONS请求
除了method为OPTIONS,header还需要添加三个字段: - Access-Control-Request-Method - Access-Control-Request-Headers - Origin