你真的知道 HTTP OPTIONS 方法的作用吗?

目录

HTTP OPTIONS 方法定义

HTTP OPTIONS 请求格式

HTTP OPTIONS 响应格式

OPTIONS 方法的作用与使用场景

OPTIONS 响应的头部信息详解

小结


HTTP(Hypertext Transfer Protocol,超文本传输协议)是互联网中被使用最广的一种网络协议,用于客户端与服务器之间的通信。HTTP 协议定义了一系列的请求方法,例如 GET、POST、PUT、DELETE 等,用于不同类型的数据操作。还有一个不太常用但同样重要的方法—OPTIONS,虽然不像 GET 或 POST 那样常用,但在网络通信中扮演着独特而重要的角色。

HTTP OPTIONS 方法定义

根据 RFC 7231规范定义,HTTP OPTIONS 方法是一个“用于获取针对特定资源的 HTTP 请求方法或 URI 的通信选项”的请求方法。简单来说,当客户端发送一个 OPTIONS 请求到服务器时,是在询问:“对于这个特定的URL,服务器能处理哪些 HTTP 方法或者有哪些特殊的限制或要求”。

HTTP OPTIONS 请求格式

OPTIONS 请求的格式与其他 HTTP 请求方法并无太大差异,包括以下部分:

OPTIONS /resource HTTP/1.1
Host: example.com
Accept: */*
  • OPTIONS :请求方法,表示客户端希望获取目标资源支持的 HTTP 方法。
  • /resource:请求的 URI,即客户端想要了解的资源路径。
  • Host:指定请求的目标主机名和端口号。
  • Accept:可选,表明客户端能够接受的响应内容类型。在 OPTIONS 请求中,通常设置为 */*,表示可以接受任何类型的响应。

HTTP OPTIONS 响应格式

服务器对 OPTIONS 请求的响应通常包含如下关键信息:

HTTP/1.1 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Length: 0
Content-Type: text/html; charset=UTF-8
Date: Tue, 4 May 2021 9:56:½9 GMT
Server: Apache/2.4.46 (Unix)
  • HTTP/1.1 200 OK:状态码和状态消息,表示请求成功。
  • Allow:列出服务器允许的 HTTP 方法,是 OPTIONS 请求的主要目的。
  • Content-Length:由于 OPTIONS 请求通常不返回实体内容,此处为0。
  • Content-Type:虽然没有实际内容,但服务器仍可能指明响应的 MIME 类型,如文本 HTML。
  • Date:响应生成的日期和时间。
  • Server:服务器软件及版本信息。

此外,OPTIONS 响应还可能包含其他与 CORS(跨源资源共享)相关的头部,如 Access-Control-Allow-Methods、Access-Control-Allow-Headers、Access-Control-Max-Age 等。

OPTIONS 方法的作用与使用场景

  • 探查服务器功能,客户端在正式发起 HTTP 请求之前,先向服务器询问该资源支持哪些  HTTP 方法。这样可以根据这些信息来决定是否发起请求,避免发送服务器无法处理的请求,从而提高通信效率并减少错误。例如,假设客户端需要向某个 API 接口上传文件,但在不确定服务器是否支持 PUT 或 POST 方法的情况下,直接发送 PUT 或 POST 请求可能会导致请求失败。通过先发送一个 OPTIONS 请求,客户端可以得知服务器是否支持所需的 HTTP 方法,再决定是否继续执行上传操作。
  • 跨源资源共享(CORS),OPTIONS 方法在现代 Web 开发中的一个重要应用场景是跨源资源共享(Cross-Origin Resource Sharing,CORS)。当浏览器从一个源向另一个源发起 HTTP 请求时,如果是非简单请求,浏览器会自动发送一个预检(preflight)请求,即一个 OPTIONS 请求,来询问服务器是否允许这样的跨源请求。服务器收到 OPTIONS 请求后,会在响应中添加 CORS 相关头部信息,如 Access-Control-Allow-Methods、Access-Control-Allow-Headers 等,告知浏览器允许的 HTTP 方法、允许的请求头部信息。只有当预检请求得到肯定答复后,浏览器才会继续发送实际的跨源请求。
  • RESTful API 元信息发现,在设计 RESTful API 时,OPTIONS 方法也可用于提供资源的元信息发现功能。客户端可以通过发送一个 OPTIONS 请求到资源 URI,获取该资源支持的操作列表(即HTTP方法),甚至可以包括每个方法的简要说明、参数要求等附加信息。这样,客户端无需查阅文档即可动态探索 API 的功能,增强了 API 的自描述性和易用性。

浏览器将CORS请求分为两类:简单请求(simple request)和非简单请求(not-so-simple request)。简单请求满足以下两个条件:

1. 请求方法是 HEAD、GET 或 POST 之一。

2. HTTP 的头信息不超出以下几种字段:Accept、Accept-Language、Content-Language、Last-Event-ID、Content-Type(只限于 application/x-www-form-urlencoded、multipart/form-data、text/plain 三个值)。

OPTIONS 响应的头部信息详解

  • Allow,Allow 是 OPTIONS 请求最核心的返回信息,列出了服务器允许的 HTTP 方法。例如:
Allow: GET, POST, HEAD, OPTIONS

说明服务器支持对指定资源执行 GET、POST、HEAD 和 OPTIONS 这四种 HTTP 方法。客户端可以根据这些信息判断是否可以安全地执行预期的操作。

在跨源资源共享场景中,OPTIONS 响应可能包含以下 CORS 相关头部信息:

  • Access-Control-Allow-Methods,服务器允许的 HTTP 方法列表,用于回应预检请求。例如:
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
  • Access-Control-Allow-Headers,列举了服务器允许客户端在实际请求中使用的自定义头部字段。例如:
Access-Control-Allow-Headers: Content-Type, X-Custom-Header
  • Access-Control-Allow-Credentials,若值为 true,表示服务器允许客户端在跨源请求中携带 Cookie 或 HTTP 认证信息。
Access-Control-Allow-Credentials: true
  • Access-Control-Max-Age,指示预检请求的结果(即上述CORS相关头部信息)可以在浏览器中缓存的最大时间(秒)。这样做可以避免对同一资源的重复预检请求,提高性能。
Access-Control-Max-Age: 3600

小结

HTTP OPTIONS 方法主要用于获取目标资源支持的 HTTP 方法列表。在实现 CORS、安全性检查和预检请求等方面,OPTIONS 方法发挥着重要作用。通过了解 OPTIONS 方法的工作原理和应用场景,可以更好地利用这一工具,提高 Web 应用的安全性和可扩展性。

文章持续更新中,微信搜索【路多辛】阅读更多优质文章

  • 12
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
是的,对于跨域请求,浏览器会先发送一个 OPTIONS 请求,用于检测服务器是否支持跨域请求。因此,需要在服务器端对 OPTIONS 请求进行处理,允许跨域请求。 在 Nginx 中,可以使用以下配置来允许 OPTIONS 请求: ``` location /api { if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain; charset=utf-8'; add_header 'Content-Length' 0; return 204; } add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range'; proxy_pass http://localhost:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } ``` 上面的配置中,如果请求方法OPTIONS,就添加 Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers 等响应头,并且返回状态码 204 No Content,表示服务器支持跨域请求。如果请求方法是 GET 或者 POST,就添加 Access-Control-Allow-Origin、Access-Control-Allow-Credentials、Access-Control-Allow-Methods、Access-Control-Allow-Headers、Access-Control-Expose-Headers 等响应头,并将请求转发到后端服务上。 综上所述,对于跨域请求,需要在服务器端对 OPTIONS 请求进行处理,并设置允许跨域请求的响应头,才能正常进行跨域请求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路多辛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值