options请求出现在跨域中,是一种安全的请求,不会修改服务器中的资源。
这是一种浏览器预检行为,预先检测服务器是否支持复杂请求。
简单请求的定义如下,不满足的就是复杂请求:
1.请求方式只能是:GET、POST、HEAD
2.HTTP请求头限制这几种字段(不得人为设置该集合之外的其他首部字段):
Accept、Accept-Language、Content-Language、Content-Type(需要注意额外的限制)、DPR、Downlink、Save-Data、Viewport-Width、Width
3.Content-type只能取:application/x-www-form-urlencoded、multipart/form-data、text/plain
4.请求中的任意XMLHttpRequestUpload 对象均没有注册任何事件监听器;XMLHttpRequestUpload 对象可以使用 XMLHttpRequest.upload 属性访问。
5.请求中没有使用 ReadableStream 对象。
非简单请求 会在正式通信之前,增加一次HTTP请求,称之为预检请求。浏览器会先发起OPTIONS方法到服务器,以获知服务器是否允许该实际请求。
目前所有主流浏览器(IE需要10)都支持跨域请求(cors),而跨域请求的关键在于服务器返回的响应头。
“预检”请求用的请求方法是OPTIONS
,表示这个请求是用来询问的。头信息里面,关键字段是Origin
,表示请求来自哪个源。
如果服务器允许任意跨域,则返回如下字段:
Access-Control-Allow-Origin: *
可以看出options请求是cors请求的一个副产品,如果确定不需要options,可以禁止该请求。以apache为例,可以使用如下伪静态禁止:
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_METHOD} ^(OPTIONS) RewriteRule .* - [F] </IfModule>