预检请求OPTIONS详解

1,243 阅读2分钟

一、什么是OPTIONS?

OPTIONS请求方法的主要用途有两个:

  1. 获取服务器支持的HTTP请求方法;
  2. 用来检查服务器的性能。例如:AJAX进行跨域请求时的预检,需要向另外一个域名的资源发送一个HTTP OPTIONS请求头,用以判断实际发送的请求是否安全。

这是浏览器给我们加上的,后端并没有做任何操作。

二、为什么要用OPTIONS

OPTIONS请求旨在发送一种“探测”请求以确定针对某个目标地址的请求必须具有怎样的约束(比如应该采用怎样的HTTP方法以及自定义的请求报头),然后根据其约束发送真正的请求。比如针对“跨域资源”的预检(Preflight)请求采用的HTTP方法就是OPTIONS。

简而言之,OPTIONS请求方法的主要用途有两个:

  1. 获取服务器支持的HTTP请求方法;
  2. 用来检查服务器的性能。

三、什么时候会触发OPTIONS请求?

当请求满足下述任一条件时,即应首先发送预检请求(使用OPTIONS):

  1. 使用了下面任一 HTTP 方法:
PUT

DELETE

CONNECT

OPTIONS

TRACE

PATCH
  1. 人为设置了对 CORS 安全的首部字段集合之外的其他首部字段。该集合为:
Accept

Accept-Language

Content-Language

Content-Type (but note the additional requirements below)

DPR

Downlink

Save-Data

Viewport-Width

Width
  1. Content-Type 的值不属于下列之一:
application/x-www-form-urlencoded

multipart/form-data

text/plain

四、关于触发OPTIONS返回200之后却没有触发正式请求的问题

  1. 查看OPTIONS的reponse headers中Access-Control-Request-Method是否跟后端一开始约定的一样

  2. 查看OPTIONS的reponse headers中Access-Control-Request-Headers 的自定义headers字段是否跟后端一开始约定的一样

如果有需要也可以看下阮老师的博客:www.ruanyifeng.com/blog/2016/0…