跨域问题的原因的常见解决思路
1. 什么是跨域问题?
跨域问题(Cross-Origin Resource Sharing,CORS)是指浏览器出于安全考虑,阻止网页向不同源的服务器发起请求。同源策略(Same-Origin Policy,SOP) 规定:
- 协议(http/https)、域名(example.com)、端口(:80/:443)必须相同,否则就会触发跨域限制。
例如以下情况都会触发跨域:
| 情况 | 示例 | 是否跨域 |
|---|---|---|
| 协议不同 | http://example.com → https://example.com |
❌跨域 |
| 域名不同 | https://example.com → https://api.example.com |
❌跨域 |
| 端口不同 | http://example.com:3000 → http://example.com:8080 |
❌跨域 |
| 同源 | https://example.com:443 → https://example.com:443 |
✅ 不跨域 |
2. 常见的跨域解决方案
| 方法 | 适用场景 | 实现方式 |
|---|---|---|
| CORS(后端允许跨域) | 推荐方式,适用于所有请求 | 在服务器添加 Access-Control-Allow-Origin |
| JSONP(仅支持 GET) | 仅支持 GET 请求 | 前端 <script> 请求,后端返回 callback(data) |
| Nginx 反向代理 | 代理跨域请求 | 通过 Nginx proxy_pass 转发请求 |
| 前端 Webpack/Vite 代理 | 本地开发时解决跨域 | proxy 代理后端请求到相同源 |
| 同源部署 | 生产环境 | 将前端和后端放在同一域名 |
3. 具体解决方案(部分)
(1)CORS 解决跨域(后端配置)
适用于所有请求方式(GET, POST, PUT, DELETE 等)
- Node.js/Express 示例:
const cors = require('cors'); app.use(cors()); // 允许所有域访问 - 手动设置 HTTP 头:
res.setHeader("Access-Control-Allow-Origin", "*"); res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE"); res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
(2)Nginx 反向代理
适用于前端请求同源但后端不同源,这个简单好用,很推荐
server {
location /api/ {
proxy_pass http://backend.com/;
proxy_set_header Host backend.com;
}
}
(3)同源部署
适用于生产环境
- 直接在后端提供静态文件(如 React/Vue 前端):
app.use(express.static('public')); - 确保前端请求的是相对路径
fetch("/api/data")而不是绝对路径fetch("https://api.example.com/data")。
4. 总结
- 跨域是由于浏览器的同源策略导致的安全限制(协议、域名、端口不同就会跨域)。
- 解决方案:
- 推荐 CORS(后端允许跨域)
- JSONP(仅支持 GET 请求,较少使用)
- Nginx 反向代理(适用于生产环境)
- Webpack/Vite 代理(适用于本地开发)
- 同源部署(根本上避免跨域)
你可以根据具体场景选择最适合的解决方案 🚀!

浙公网安备 33010602011771号