什么情况下会发送 OPTIONS 请求?

在处理跨域请求或预检请求时,浏览器会在特定条件下自动发送 OPTIONS 请求以确保通信的安全性和兼容性。

网络协议 中等 CORS HTTP HTTP请求

OPTIONS 请求是 HTTP 协议中的一种方法,主要用于在浏览器实现 CORS(跨域资源共享)机制时作为预检请求(Preflight Request),或作为普通场景中的服务器支持探测手段。以下情况会触发 OPTIONS 请求的发送,主要包括两种核心场景:

  1. CORS 预检请求(最常见场景):当浏览器发起跨域请求(不同协议、域名或端口)时,如果该请求被识别为非简单请求(Non-simple Request),浏览器会自动先发送 OPTIONS 请求来验证服务器是否允许后续实际请求。触发条件是满足任意以下条件(以请求为跨域为前提):
    • 使用的 HTTP 方法非简单:如 PUT、DELETE、PATCH、CONNECT、TRACE 或 OPTIONS 本身(简单方法仅限 GET、HEAD、POST)。
    • 包含非标准请求头:请求头中包含任何非 CORS 安全列表的自定义或特殊头字段(如 AuthorizationCustom-Header)。默认 CORS 安全列表包括 AcceptAccept-LanguageContent-LanguageContent-Type(仅限特定值)。
    • Content-Type 的值非标准:值非 application/x-www-form-urlencodedmultipart/form-datatext/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  // 缓存预检结果的时间
      

      若响应无效,浏览器将阻止后续实际请求。这确保了资源操作前权限的安全校验。

  2. 其他探测性场景(相对较少见):非前端专属面试重点,但有时用于测试或后台交互。
    • 探测服务器支持的 HTTP 方法:客户端可直接发送 OPTIONS 至特定 URL 或整站(例如用 URL: *),以查询服务器上资源允许的通信选项(如返回的 Allow: GET, POST),常用于 API 功能探测。
    • 请求无副作用安全验证:如使用 OPTIONS 检查服务器功能配置,而不触发数据交互或操作(HTTP 规范明确其为幂等方法)。

在预检流程中,OPTIONS 请求对用户代码是透明的(浏览器自动处理),开发者需确保服务器端正确配置允许跨域的响应头以避免 CORS 错误。常见触发示例为前端的 fetchXMLHttpRequest 调用含上述非简单条件时。