配置cors的核心是服务端在响应中正确返回access-control-开头的http头部,明确声明跨域策略;开发阶段可用快速放开,但生产环境必须指定具体域名,尤其携带凭证时不能与共用,多域名需动态白名单校验,预检请求须支持options并返回对应头部,带credentials时access-control-allow-origin必须为确切域名且需设access-control-allow-credentials:true。

配置CORS的核心是让服务端在响应中正确返回一系列 Access-Control- 开头的HTTP头部,告诉浏览器哪些跨域请求被允许。关键不在于前端改代码,而在于后端明确声明策略。
明确允许的源(origin)
开发阶段可用 * 快速放开,但生产环境必须指定具体域名,尤其当请求携带 Cookie 或认证信息时:
– 若前端地址是 https://app.example.com,后端需设 Access-Control-Allow-Origin: https://app.example.com
– 不能用 * + credentials: true 组合,否则浏览器直接拒绝
– 多个域名需动态匹配,例如 Koa 中写成 ctx.headers.origin 并白名单校验后再返回
处理预检请求(OPTIONS)
当请求含自定义头、非简单方法(PUT/DELETE)、或 Content-Type 为 application/json 时,浏览器会先发 OPTIONS 请求。服务端必须响应它:
– Express 中启用 cors() 中间件会自动处理
– 手动配置需确保路由能响应 OPTIONS 方法,并返回:
• Access-Control-Allow-Methods: GET, POST, PUT, DELETE
• Access-Control-Allow-Headers: Content-Type, Authorization
• Access-Control-Max-Age: 86400
支持凭证与自定义头
若前端设置了 withCredentials: true 或 credentials: 'include':
– 后端必须返回 Access-Control-Allow-Credentials: true
– Access-Control-Allow-Origin 不能为 *,必须是确切域名
– 如需前端传 X-Request-ID 等自定义头,须在 Access-Control-Allow-Headers 中显式列出
框架常见配置方式
不同后端框架有对应便捷方案:
– Express:安装 cors 包,app.use(cors({ origin: ['https://a.com', 'https://b.com'], credentials: true }))
– Flask:用 flask_cors,全局调用 CORS(app) 或单路由加 @cross_origin()
– Spring Boot:通过 @CrossOrigin 注解或配置 WebMvcConfigurer bean 全局生效
– NocoBase / Koa:在插件中间件中使用 @koa/cors,注意 credentials 与 origin 的联动逻辑











