线上环境解决跨域问题的完整方案:
第一步:确认问题根源
-
浏览器控制台检查
- 打开开发者工具(F12),查看网络请求的报错信息:
- 若出现
CORS policy blocked,说明是跨域问题。 - 观察请求是否发送了 OPTIONS 预检请求(复杂请求的标志)。
- 若出现
- 示例报错:
Access to XMLHttpRequest at 'http://api.example.com/data' from origin 'https://www.example.com' has been blocked by CORS policy.
- 打开开发者工具(F12),查看网络请求的报错信息:
-
验证是否为浏览器限制
- 用 Postman 或 curl 直接请求接口,若正常返回,则确认是浏览器跨域问题。
第二步:解决方案选择
根据线上环境特点,推荐以下两种主流方案:
方案一:后端配置 CORS(推荐)
适用场景:后端服务可控(如自建 API 服务)。
操作步骤:
-
设置响应头:后端在响应中添加 CORS 头。
- 通用配置示例(以 Node.js 为例):
// Express 中间件 app.use((req, res, next) => { res.setHeader("Access-Control-Allow-Origin", "https://www.example.com"); // 允许的域名 res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE"); res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization"); res.setHeader("Access-Control-Allow-Credentials", "true"); // 允许携带 Cookie next(); }); - Nginx 反向代理配置:
location /api { add_header 'Access-Control-Allow-Origin' 'https://www.example.com'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,Content-Type'; proxy_pass http://backend-server; }
- 通用配置示例(以 Node.js 为例):
-
处理 OPTIONS 预检请求:
- 确保后端正确处理
OPTIONS方法(返回 200 状态码并携带 CORS 头)。 - Express 示例:
app.options('*', (req, res) => { res.sendStatus(200); });
- 确保后端正确处理
-
验证配置:
- 检查响应头是否包含
Access-Control-Allow-Origin等字段。
- 检查响应头是否包含
方案二:Nginx 反向代理
适用场景:前端与后端域名不同,且需隐藏后端地址或统一入口。
操作步骤:
-
配置 Nginx 代理:
server { listen 80; server_name www.example.com; location /api { proxy_pass http://api-server:8080; # 后端实际地址 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location / { root /usr/share/nginx/html; # 前端静态资源目录 index index.html; } }- 原理:浏览器访问
https://www.example.com/api/data→ Nginx 转发到http://api-server:8080/data,绕过跨域限制。
- 原理:浏览器访问
-
重启 Nginx:
nginx -s reload -
前端代码调整:
- 将所有 API 请求路径改为相对路径(如
/api/data而非http://api.example.com/data)。
- 将所有 API 请求路径改为相对路径(如
方案三:CDN/云服务配置 CORS
适用场景:使用云存储(如 AWS S3、阿里云 OSS)托管静态资源。
操作步骤(以 AWS S3 为例):
- 进入 S3 控制台 → 选择存储桶 → Permissions → CORS Configuration。
- 配置 CORS 规则:
[ { "AllowedHeaders": ["*"], "AllowedMethods": ["GET", "POST"], "AllowedOrigins": ["https://www.example.com"], "ExposeHeaders": [] } ] - 保存并刷新 CDN 缓存(如有)。
第三步:处理携带 Cookie 的跨域请求
若请求需携带 Cookie(如身份验证),需额外配置:
- 前端:设置
withCredentials: true。// Axios 示例 axios.get('https://api.example.com/data', { withCredentials: true }); - 后端:
- 设置
Access-Control-Allow-Credentials: true。 Access-Control-Allow-Origin必须指定具体域名(不能为*)。
- 设置
第四步:验证与调试
- 检查响应头:
- 使用浏览器开发者工具查看响应头是否包含正确的 CORS 字段。
- 测试复杂请求:
- 发送一个
PUT请求,观察是否触发 OPTIONS 预检请求并成功响应。
- 发送一个
- 日志排查:
- 查看后端服务器日志,确认请求是否到达及可能的错误。
常见问题排查
| 问题现象 | 解决方案 |
|---|---|
OPTIONS 404 | 确保后端正确处理 OPTIONS 方法 |
Credentials 不被允许 | 检查 Access-Control-Allow-Credentials 是否为 true,且 Origin 不为 * |
AllowedHeaders 缺失 | 添加 Access-Control-Allow-Headers 包含请求中使用的头(如 Authorization) |
终极应急方案(不推荐)
若临时无法修改后端或 Nginx,可强制浏览器禁用安全策略(仅限测试环境):
# Chrome 启动参数(关闭跨域限制)
chrome.exe --disable-web-security --user-data-dir=/tmp
注意:此操作会降低浏览器安全性,禁止在生产环境中使用!
总结:
- 首选方案:后端配置 CORS 或 Nginx 反向代理。
- 核心要点:确保响应头正确、处理 OPTIONS 请求、验证携带 Cookie 的场景。
- 避坑指南:避免使用
Access-Control-Allow-Origin: *时携带 Cookie。

599

被折叠的 条评论
为什么被折叠?



