新手在调用API时最常遇到的拦路虎,除了401/403错误,大概就是这个红色报错了:
Access to fetch at 'http://api.example.com' from origin 'http://my-site.com'
has been blocked by CORS policy
别慌!花5分钟看完这篇,你就能从CORS小白变身解决小能手!
假设你住的小区(http://my-site.com)有个严格规定:
同源策略:只允许本小区住户(相同协议+域名+端口)自由进出,外卖快递需要登记
有一天你想去隔壁小区(http://api.example.com)拿快递,这时候会出现两种场景:
通行证
(请求头带Origin
)允许通行
的牌子(响应头含Access-Control-Allow-Origin: *
)GET /data HTTP/1.1
Origin: http://my-site.com
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
OPTIONS
预检请求)OPTIONS /data HTTP/1.1
Origin: http://my-site.com
Access-Control-Request-Method: PUT
HTTP/1.1 204 OK
Access-Control-Allow-Origin: http://my-site.com
Access-Control-Allow-Methods: PUT, DELETE
以Node.js为例,只需要5行代码:
const express = require('express');
const cors = require('cors');
const app = express();
app.use(cors({
origin: 'http://trusted-site.com', // 指定允许的源
methods: ['GET', 'POST'] // 允许的方法
}));
常见配置项表格:
响应头 | 作用示例 | 安全提示 |
---|---|---|
Access-Control-Allow-Origin | * 或 https://example.com |
生产环境慎用通配符* |
Access-Control-Allow-Methods | GET, POST, PUT |
按需开放,不要用ALL |
Access-Control-Allow-Headers | Content-Type, Authorization |
白名单机制更安全 |
Access-Control-Max-Age | 86400 (1天缓存) |
减少预检请求次数 |
因为你的前端跑在http://localhost:3000
,后端在http://localhost:8080
→ 端口不同也算跨域!
✅ 解决方案:
Access-Control-Allow-Origin: *
检查顺序:
Access-Control-Allow-Credentials: true
黄金三原则:
origin
白名单Access-Control-Allow-Origin: *
Strict-Transport-Security
记住这个口诀:
跨域请求不用慌,CORS头来帮忙
简单请求直接过,特殊请求先问岗
配置切记安全性,生产别用通配项
现在你已经掌握了CORS的核心要点!下次再遇到跨域问题,就像小区保安一样从容检查"通行证"吧~