access-control-allow-origin是服务器必须在响应头中设置的cors核心字段,用于明确允许哪些源读取响应内容;其值须与请求origin严格匹配或为,但设时不可携带凭证,且常需配合allow-methods、allow-headers等其他头共同生效。

服务器通过在 HTTP 响应头中添加 Access-Control-Allow-Origin 字段,明确告诉浏览器:“这个来源的网页,被允许读取本响应的内容”。这不是前端能“加”出来的,而是必须由后端(或网关)在返回给浏览器的 response 中设置。关键在于:**只有服务端正确返回该响应头,浏览器才会把响应数据交给 JS 处理;否则即使请求发出去、服务器也成功返回了,JS 依然拿不到结果。**
核心设置规则
该响应头值必须与发起请求的页面来源(即请求头中的 Origin)严格匹配,或设为通配符 *:
-
Access-Control-Allow-Origin: https://your-app.com—— 允许指定域名(含协议和端口),最安全常用 -
Access-Control-Allow-Origin: *—— 允许任意源,但此时不能同时发送 Cookie 或认证凭据(如credentials: 'include') -
Access-Control-Allow-Origin: null—— 极少用,仅适用于某些本地文件(file://)场景,现代浏览器大多已限制
必须配合的其他响应头(按场景)
单设 Access-Control-Allow-Origin 往往不够,尤其涉及非简单请求时:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 如果前端带了自定义 header(如
Authorization、X-Request-ID)或 Content-Type 是application/json,服务器需额外返回:Access-Control-Allow-Headers: Authorization, Content-Type, X-Requested-With - 如果前端用了
fetch(..., { method: 'PUT' })或{ credentials: 'include' },服务器还需返回:Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONSAccess-Control-Allow-Credentials: true(注意:此时Allow-Origin不能为*,必须写具体域名) - 如果前端需要读取响应中的自定义 header(如
X-Total-Count),服务器要显式暴露:Access-Control-Expose-Headers: X-Total-Count, X-RateLimit-Remaining
常见后端设置方式
不同环境写法略有差异,本质都是在响应发出前写入对应 header:
-
Node.js / Express:用
cors中间件最稳妥app.use(cors({ origin: 'https://your-app.com', credentials: true }))
或手动设置:res.setHeader('Access-Control-Allow-Origin', 'https://your-app.com');res.setHeader('Access-Control-Allow-Credentials', 'true'); -
Nginx:在
location或server块中添加add_header 'Access-Control-Allow-Origin' 'https://your-app.com';add_header 'Access-Control-Allow-Credentials' 'true';add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
注意:OPTIONS 预检请求需单独处理(通常用if ($request_method = 'OPTIONS') { add_header ...; return 204; }) -
PHP:在脚本开头加入
header('Access-Control-Allow-Origin: https://your-app.com');header('Access-Control-Allow-Credentials: true'); -
Java(Spring Boot):加注解
@CrossOrigin(origins = "https://your-app.com", allowCredentials = "true")
验证是否生效
打开浏览器开发者工具 → Network → 点击请求 → 查看 Response Headers 部分,确认存在且值正确。若仍报错,重点检查:
- 响应头名称是否拼写错误(如写成
Access-Control-Allow-Orgin) - 是否遗漏了
OPTIONS预检请求的响应头(尤其是带 token 或 JSON 的 POST) - 前端
credentials和后端Allow-Credentials是否成对启用 - Nginx 或 CDN 是否缓存了旧响应(header 未更新)










