当一个浏览器向服务器发起跨域请求时,若该请求属于”复杂请求”,会先自动发送一次OPTIONS请求作为”预检请求”,服务器正确处理这类请求,是构建现代Web应用的重要技术基础,以下是关于OPTIONS请求的核心知识点与技术实践:
HTTP规范定义的探测机制
OPTIONS是HTTP/1.1协议定义的请求方法,用于获取目标资源所支持的通信选项,客户端通过该方法确定:
预检请求(Preflight Request)的触发条件
当请求满足以下任一条件时,浏览器自动发起OPTIONS预检:
PUT
、DELETE
等非简单方法Authorization
)Content-Type
为application/json
等非简单类型服务器应返回包含以下关键响应头的200状态码:
Access-Control-Allow-Origin: https://example.com // 允许的源 Access-Control-Allow-Methods: GET,POST,OPTIONS // 支持的方法 Access-Control-Allow-Headers: Content-Type,Authorization // 允许的请求头 Access-Control-Max-Age: 86400 // 预检结果缓存时间(秒)
Access-Control-Allow-Origin
Access-Control-Request-Method
与服务器支持的方法列表Access-Control-Max-Age
减少重复预检请求(建议值:7200秒及以上)# Nginx配置示例 location /api/ { if ($request_method = OPTIONS) { add_header 'Access-Control-Allow-Origin' '$http_origin'; add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,Content-Type'; add_header 'Access-Control-Max-Age' 1728000; return 204; } }
当请求携带Authorization
头时:
Access-Control-Allow-Headers
中明确声明该头Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin
的值TRACE
等危险方法)Origin
头的合法性Server
、X-Powered-By
等服务器指纹信息问题现象 | 排查方向 |
---|---|
CORS预检失败 | 检查响应头完整性,验证方法/头部的匹配度 |
重复发送OPTIONS请求 | 确认Access-Control-Max-Age 是否生效 |
特定浏览器兼容性问题 | 测试不同内核浏览器的CORS实现差异 |
认证信息丢失 | 检查Access-Control-Allow-Credentials 配置 |