OPTIONS 是做什么的
OPTIONS 用来询问目标资源支持哪些通信选项,服务器通常把支持的方法列在 Allow 响应头里。这个请求不带请求体、不改变资源状态,属于安全且幂等的方法。跨域场景中浏览器发出的 CORS 预检请求用的也是 OPTIONS,所以它既是接口能力探测手段,也是前端跨域能否走通的前置条件。
基本信息
| 方法名 | OPTIONS |
|---|---|
| 作用 | 探测资源支持的通信选项,也是 CORS 预检请求使用的方法 |
| 规范 | RFC 9110 第 9.3.7 节 |
| 特性 | 安全且幂等,不修改资源状态 |
| 特殊形式 | OPTIONS * 针对整个服务器而非某个资源 |
探测与实际预检
探测与实际预检
curl -si -X OPTIONS https://api.example.com/users # 看 Allow 头与状态码
# HTTP/1.1 204 No Content
# Allow: GET, POST, HEAD, OPTIONS
curl -si -X OPTIONS https://api.example.com/users \
-H 'Origin: https://app.example.com' \
-H 'Access-Control-Request-Method: PUT' # 模拟浏览器预检,看 CORS 头输出逐列读法
| 观察项 | 含义 | 正常与异常 |
|---|---|---|
| Allow | 该资源支持的方法清单 | 缺失通常说明框架没暴露 OPTIONS 或网关拦截了 |
| 状态码 | 本次探测是否被接受 | 204 或 200 正常;404 多为路由未部署;405 说明资源未实现 OPTIONS |
| Access-Control-Allow-Origin | 允许的跨域来源 | 带 Origin 请求时缺失该头,浏览器会拦掉真实请求 |
| Access-Control-Allow-Methods | 预检放行的方法 | 不含真实请求用的方法时,预检直接失败 |
| Access-Control-Max-Age | 预检结果可缓存秒数 | 配得太短等于每次请求都追加一次预检 |
OPTIONS * 询问的是整台服务器而不是某个资源,部分实现会直接返回 400;日常排障优先对具体路径发请求。
只有带上 Origin 请求头的 OPTIONS 才会返回 CORS 相关响应头;不带 Origin 时它只是一次普通的能力探测。
在 Kubernetes Ingress、云网关或企业反向代理后面,OPTIONS 经常被网关直接应答,后端应用完全看不到这次请求。排查预检问题时先确认是哪一层回应的,再看那一层的跨域配置,方向才不会跑偏。