一个CORS报错我查了一天最后发现浏览器收到了两个Access-Control头 前端调接口浏览器 Console 一片红Access to XMLHttpRequest at https://api.wuxiannet.com/blog/list from origin https://blog.wuxiannet.com has been blocked by CORS policy: The Access-Control-Allow-Origin header contains multiple values *, *, but only one is allowed.两个*。问题出在哪排查过程后端 Spring Boot 配了 CORSConfigurationpublicclassCorsConfigimplementsWebMvcConfigurer{OverridepublicvoidaddCorsMappings(CorsRegistryregistry){registry.addMapping(/**).allowedOrigins(*).allowedMethods(*).allowedHeaders(*);}}同时 Nginx 也加了add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods *; add_header Access-Control-Allow-Headers *;每一层各加了一次 CORS 头。浏览器收到了两个Access-Control-Allow-Origin: *直接拒收。CORS 规范规定Access-Control-Allow-Origin只能有一个值。多个值浏览器认为响应不合法请求被拦截。正确做法只让一处加Spring Boot 和 Nginx二选一。推荐 Nginx 层统一处理# ✅ Nginx 统一 CORSSpring 删掉 CorsConfig location /api/ { if ($request_method OPTIONS) { add_header Access-Control-Allow-Origin $http_origin; add_header Access-Control-Allow-Methods GET, POST, PUT, DELETE, OPTIONS; add_header Access-Control-Allow-Headers Authorization, Content-Type; add_header Access-Control-Max-Age 86400; return 204; } add_header Access-Control-Allow-Origin $http_origin; proxy_pass http://127.0.0.1:8083; }$http_origin是 Nginx 变量取请求头里的Origin。不用*是因为 CORS 规范里*和credentials: true不兼容。如果必须用 Spring 配就删 Nginx 的 CORS 配置确保只有一处产出。CORS 的本质跨域请求不是禁止是需要服务器明确允许。浏览器发请求前会先发一个 OPTIONS 预检请求Preflight问服务器「我能跨域调你吗」服务器返回 CORS 头后浏览器判断是否匹配。不匹配或头有错误请求都不会发出。常见的 CORS 错误不止双重头错误原因两个Access-Control-Allow-Origin多层加了 CORSNginx SpringOrigin not allowedallowedOrigins没包含请求来源Credentials 报错用了*但前端传了withCredentialsOPTIONS 返回 403没处理预检请求CORS 报错不是莫名奇妙的。打开 Network 看 OPTIONS 响应头逐个对比你的 CORS 配置定位很快。多层加 CORS 是典型的「各管各」问题——Nginx 觉得自己该加Spring 也觉得自己该加。结果是两个人都加了浏览器不认。谁在最外层谁管 CORS。内部别插手。关于作者无羡独立开发者全栈工程师专注 AI 应用与微服务架构。 分类独立开发实战 个人博客 — 更多技术文章✨ 开发者福利整理 — 云服务资源汇总 软件工坊 — 我的技术分享 个人门户 — 独立开发作品全集