什么情况下会发送 OPTIONS 请求?
在处理跨域请求或预检请求时,浏览器会在特定条件下自动发送 OPTIONS 请求以确保通信的安全性和兼容性。
OPTIONS 请求是 HTTP 协议中的一种方法,主要用于在浏览器实现 CORS(跨域资源共享)机制时作为预检请求(Preflight Request),或作为普通场景中的服务器支持探测手段。以下情况会触发 OPTIONS 请求的发送,主要包括两种核心场景:
- CORS 预检请求(最常见场景):当浏览器发起跨域请求(不同协议、域名或端口)时,如果该请求被识别为非简单请求(Non-simple Request),浏览器会自动先发送 OPTIONS 请求来验证服务器是否允许后续实际请求。触发条件是满足任意以下条件(以请求为跨域为前提):
- 使用的 HTTP 方法非简单:如 PUT、DELETE、PATCH、CONNECT、TRACE 或 OPTIONS 本身(简单方法仅限 GET、HEAD、POST)。
- 包含非标准请求头:请求头中包含任何非 CORS 安全列表的自定义或特殊头字段(如
Authorization
、Custom-Header
)。默认 CORS 安全列表包括Accept
、Accept-Language
、Content-Language
、Content-Type
(仅限特定值)。 - Content-Type 的值非标准:值非
application/x-www-form-urlencoded
、multipart/form-data
或text/plain
(如为application/json
则会触发)。
在此场景下: - 浏览器发送的 OPTIONS 请求会包含两个重要头部:
Access-Control-Request-Method
声明实际请求方法(如 PUT)。Access-Control-Request-Headers
声明非标准头(如Authorization
)。
- 服务器须响应允许状态(如返回 2xx 状态码和以下头部):
Access-Control-Allow-Origin: https://example.com Access-Control-Allow-Methods: POST, GET Access-Control-Allow-Headers: Authorization Access-Control-Max-Age: 86400 // 缓存预检结果的时间
若响应无效,浏览器将阻止后续实际请求。这确保了资源操作前权限的安全校验。
- 其他探测性场景(相对较少见):非前端专属面试重点,但有时用于测试或后台交互。
- 探测服务器支持的 HTTP 方法:客户端可直接发送 OPTIONS 至特定 URL 或整站(例如用
URL: *
),以查询服务器上资源允许的通信选项(如返回的Allow: GET, POST
),常用于 API 功能探测。 - 请求无副作用安全验证:如使用 OPTIONS 检查服务器功能配置,而不触发数据交互或操作(HTTP 规范明确其为幂等方法)。
- 探测服务器支持的 HTTP 方法:客户端可直接发送 OPTIONS 至特定 URL 或整站(例如用
在预检流程中,OPTIONS 请求对用户代码是透明的(浏览器自动处理),开发者需确保服务器端正确配置允许跨域的响应头以避免 CORS 错误。常见触发示例为前端的 fetch
或 XMLHttpRequest
调用含上述非简单条件时。