字节面试官问完我 HTTP 一般有哪些请求头之后
我细「嗦」了一下我知道的,然后面试官就问我
"那你知道OPTIONS方法一般用在哪里吗?"
我:"就是用来判断服务器支持啥方法吧。"
“还有吗?”
“没有了”
后面又聊到了跨域问题,面试官让咱详细说一下
CORS里面的预监请求。下来看了才知道,原来
OPTIONS还可以这样用(
好了那话不多说,我们具体来看看 OPTIONS 能用来干嘛
1. 检测服务器所支持的请求方法
- 可以使用 OPTIONS 发起请求,以检测服务器支持哪些 HTTP 方法:
curl -X OPTIONS http://example.org -i
这里就会有响应, Allow就是告诉咱这里能够使用啥。
HTTP/1.1 200 OK
Allow: OPTIONS, GET, HEAD, POST
Cache-Control: max-age=604800
Date: Thu, 13 Oct 2016 11:45:00 GMT
Expires: Thu, 20 Oct 2016 11:45:00 GMT
Server: EOS (lax004/2813)
x-ec-custom-error: 1
Content-Length: 0
「小声bb」我测试了一下我自己的服务器,好像因为是从外部访问,返回 405 了
405 Method Not Allowed 就是说咱不被允许访问了
诺,这是它的响应值。
HTTP/2 405
server: nginx
date: Tue, 01 Nov 2022 05:58:34 GMT
content-type: text/html
content-length: 150
2. 可以用来发送预检请求。
这里我们可以细说一下,举个例子吧~
比如说 CORS 跨域,他分为了简单请求和复杂请求,对于简单请求来说,我们不需要使用 OPTIONS 来发送预检请求,只需要正常发送请求就成。
那什么是简单请求呢?
凡是同时满足以下两种情况的就是简单请求,反之则非简单请求
- 请求方法是以下方三种方法之一
- HEAD
- GET
- POST
- HTTP的头信息不超出以下几种字段
- Accept
- Accept-Language
- Content-Language
- Last-Event-ID
- Content-Type:只限于三个值 `application/x-www-form-urlencoded`、`multipart/form-data`、`text/plain`
- 预检请求形式
OPTIONS /resources/post-here/ HTTP/1.1
Host: bar.other
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Origin: http://foo.example
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-PINGOTHER, Content-Type
- tips:如果简单请求的响应头或者预检请求的响应头没有携带
Access-Control-Allow-xxx之类的字段,多半是不能使用跨域(