服务端未启用CORS预检支持会导致OPTIONS请求返回405或空Allow头;需显式配置路由、暴露响应头并避免认证头干扰。

OPTIONS 请求返回 405 或空 Allow 头?检查服务端是否真正启用 CORS 预检支持
很多后端框架默认不处理 OPTIONS 请求,或只在配置了 CORS 中间件时才返回 Allow 头。如果你看到响应里没有 Allow 字段,或者直接返回 405 Method Not Allowed,大概率是服务端压根没注册对 OPTIONS 的路由处理逻辑。
实操建议:
- Node.js/Express:必须显式添加
app.options("*", (req, res) => { res.set("Allow", "GET, POST, PUT, DELETE").send(); });,不能只靠cors()中间件——它默认不响应预检请求的Allow头 - Spring Boot:需确认
@CrossOrigin注解作用在 Controller 方法或类上,且未设置methods = {}空数组;若用全局配置,检查WebMvcConfigurer.addCorsMappings()是否调用了allowedMethods("*") - Nginx 反向代理场景:如果后端没开 OPTIONS,Nginx 可能直接拦截并返回 405;此时应在 Nginx 配置中加
location / { if ($request_method = 'OPTIONS') { add_header Allow "GET, POST, PUT, DELETE"; add_header Access-Control-Allow-Origin "*"; add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE"; add_header Access-Control-Allow-Headers "Content-Type, Authorization"; return 204; } }
XML 文件本身不影响 OPTIONS 响应,但 Accept 头可能触发服务端错误路由
OPTIONS 请求本质是查“这个 URL 支持哪些方法”,跟请求体或 Accept 头无关。但有些老旧 API 会根据 Accept: application/xml 错误地走 XML 路由分支,而该分支没实现 OPTIONS,导致 404 或 500。
实操建议:
- 发请求时不要带
Accept、Content-Type等业务相关 header,保持最简:curl -X OPTIONS https://api.example.com/v1/users - 如果必须模拟客户端行为,先用
curl -I -X OPTIONS ...看响应头是否含Allow,再逐步加 header 排查 - 某些 ASP.NET Web API 会因
Accept匹配失败而 fallback 到默认控制器,而该控制器没重写Options方法——此时要检查GlobalConfiguration.Configuration.Formatters中 XML formatter 是否干扰了路由选择
浏览器自动发起的预检 OPTIONS 不暴露 Allow 头?检查 Access-Control-Expose-Headers 配置
你在浏览器控制台看到 OPTIONS 请求成功(200/204),但 JS 里读不到 response.headers.get("Allow"),是因为浏览器默认只暴露 Cache-Control、Content-Language、Content-Type 等少数 header。想让前端拿到 Allow,服务端必须显式声明。
实操建议:
- Spring Boot:在
@CrossOrigin加exposedHeaders = ["Allow"] - Express:中间件里加
res.set("Access-Control-Expose-Headers", "Allow"); - 注意:Nginx 代理时,如果上游没返回
Access-Control-Expose-Headers,Nginx 不会自动补——得在 proxy_pass 后手动 add_header
用 curl 或 Postman 验证时,别被重定向和认证头带偏
真实环境里,OPTIONS 请求常被 301/302 重定向到带 trailing slash 的路径,或被网关要求携带 Authorization。这些都会掩盖真实的 Allow 响应。
实操建议:
- 用
curl -v -X OPTIONS -H "Origin: https://example.com" https://api.example.com/v1/users,观察原始响应行和 headers,避免 -L 自动跳转 - 如果接口需要认证,
OPTIONS请求一般**不应**带Authorization—— 预检阶段浏览器不会发送凭据,服务端也不该校验它;否则会返回 401,掩盖真正的方法支持信息 - Postman 中关闭 “Automatically persist cookies” 和 “Send authorization header with requests” 这类开关,防止插件注入干扰 header
OPTIONS 当成一等公民来对待,以及你有没有被浏览器或代理悄悄改写请求头。










