nginx需用add_header配合if拦截options请求并return 204,动态注入带always参数的完整cors头,且必须限定在/api/等接口location块内,proxy_set_header无效。

直接在 Nginx 反向代理配置中用 add_header 处理 OPTIONS 预检,核心是让浏览器收到合法的跨域响应头,并对预检请求快速放行——不是靠后端,而是由 Nginx 主动拦截并返回 204 或 200。
必须用 add_header,不能用 proxy_set_header
浏览器只检查最终响应头里有没有 Access-Control-Allow-* 字段,这些头必须由 Nginx 通过 add_header 注入到发给浏览器的响应中。proxy_set_header 是传给后端的请求头,浏览器完全看不到,对跨域无效。
显式拦截并响应 OPTIONS 请求
不能只加头就完事。浏览器发起预检时,若 Nginx 不做特殊处理,请求会继续转发给后端;而后端没配 CORS 或挂了,就会返回 500/404,导致预检失败、前端卡死。
- 用
if ($request_method = 'OPTIONS')拦截所有 OPTIONS 请求 - 在里面统一添加全部必需的 CORS 响应头
- 设置
Content-Length 0和Content-Type text/plain; charset=utf-8 - 最后用
return 204(推荐)或return 200立即响应,不走 proxy_pass
响应头要带 always 参数且内容完整
否则 401、500 等错误响应里不会带跨域头,浏览器收不到允许声明,连错误详情都看不到。
-
add_header 'Access-Control-Allow-Origin' '$http_origin' always;—— 动态回传请求来源,支持多域名;若只允单个,写死如'https://fe.example.com' -
add_header 'Access-Control-Allow-Credentials' 'true' always;—— 若前端用了withCredentials: true,此项必开,且Allow-Origin不能为* add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always;add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always;add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;- 可选加
add_header 'Access-Control-Max-Age' 86400 always;减少重复预检
避免头信息重复或冲突
所有 add_header 指令必须集中在同一 location 块内,不要分散在伪静态、主配置或多个 if 块里,否则可能被覆盖或丢失。
- 不要在 server 级别全局加跨域头,容易误配到非 API 路径(比如静态资源)
- 建议限定在
location /api/ { ... }这类明确的接口路径下 - 如果用了宝塔面板,在「反向代理」设置里勾选「启用跨域」只是基础开关,仍需进配置文件手动补全
always和 OPTIONS 处理逻辑
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











