nginx拦截options预检请求最高效,用if ($request_method = 'options') { return 204; }终止处理并配access-control-max-age 1728000、白名单origin等头,禁用后端重复cors处理。

直接在 Nginx 层面拦截并快速响应 OPTIONS 预检请求,是最有效、开销最低的优化方式。不需要后端参与,也不依赖应用逻辑,所有处理都在反向代理层完成。
用 return 204 拦截所有 OPTIONS 请求
浏览器发起复杂跨域请求前,会先发一个 OPTIONS 请求做预检。Nginx 完全可以自己处理它,不转发给后端。
- 在对应 location 块中添加:
if ($request_method = 'OPTIONS') { return 204; } - 配合必要的 CORS 响应头(如
Access-Control-Allow-Origin),确保浏览器能缓存该响应 - 注意:return 204 会终止请求处理链,不执行 proxy_pass 或其他后续指令,零资源消耗
延长预检结果缓存时间
浏览器根据 Access-Control-Max-Age 决定缓存预检响应多久。默认值太短(如 5 分钟)会导致高频重检。
- 推荐设为
1728000(20 天),覆盖绝大多数用户会话周期 - 配置示例:
add_header Access-Control-Max-Age 1728000 always; - 搭配
Vary: Origin(当允许多个域名时)可避免缓存污染
精简并固定允许的跨域参数
动态拼接或宽泛设置 CORS 头,不仅增加安全风险,还影响缓存效率和响应体积。
- 避免使用
*作为Access-Control-Allow-Origin(尤其开启凭证时) - 生产环境用白名单匹配具体域名,例如用
map指令做正则映射 - 只声明真实需要的
Access-Control-Allow-Methods和Access-Control-Allow-Headers,减少头部冗余
避免在应用层重复处理预检
如果后端框架(如 Express、Spring Boot)也启用了 CORS 中间件,而 Nginx 已处理 OPTIONS,会造成双重响应或冲突。
- 确认后端关闭自动 CORS 处理,或至少禁用对 OPTIONS 的响应
- 检查是否返回了重复的 CORS 头(如两个
Access-Control-Allow-Origin),这会让浏览器拒绝请求 - 用 curl 或浏览器开发者工具验证最终响应头是否干净、一致











