这是最直接的解决方案,不需要Nginx代理,只需后端配置:
后端配置CORS响应头:
// Node.js/Express示例
const express = require('express');
const cors = require('cors');
const app = express();
// 允许来自前端域名的跨域请求
app.use(cors({
origin: 'https://www.frontend.com',
methods: ['GET', 'POST', 'PUT', 'DELETE'],
allowedHeaders: ['Content-Type', 'Authorization']
}));
前端直接调用后端API:
// 前端代码
fetch('https://www.backend.com/api/data')
.then(response => response.json())
.then(data => console.log(data));
当CORS不可用或不方便修改后端代码时使用:
Nginx需要部署在前端服务器上(本例中是GitHub Pages。GitHub Pages不支持自定义Nginx)
⚠️ 重要问题:GitHub Pages是静态托管服务,不支持运行Nginx!这就是为什么在实际生产中:
前端部署在支持Nginx的服务器:
Nginx配置:
server {
listen 80;
server_name www.frontend.com; # 你的前端域名
# 服务前端静态文件
location / {
root /var/www/frontend;
index index.html;
try_files $uri $uri/ /index.html;
}
# 代理API请求
location /api/ {
# 添加CORS头(可选)
add_header 'Access-Control-Allow-Origin' 'https://www.frontend.com';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
# 转发到真实后端
proxy_pass https://www.backend.com/;
# 修改请求头
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
// 前端调用同源API
fetch('/api/data')
// 实际发送到:https://www.frontend.com/api/data
// Nginx转发到:https://www.backend.com/data
浏览器视角:
www.frontend.com
www.frontend.com/api/data
→ 同源!Nginx视角:
/api/data
请求/api
前缀www.backend.com/data
后端视角:
www.frontend.com
的请求跨域本质:
解决方案对比:
方案 | 部署位置 | 优点 | 缺点 |
---|---|---|---|
CORS | 后端服务器 | 简单直接,无需代理 | 需修改后端代码 |
Nginx代理 | 前端服务器 | 前端无需修改代码 | 需要服务器控制权 |
API网关 | 独立服务器 | 专业解决方案 | 架构复杂 |
GitHub Pages限制:
简单项目:
完整项目:
学习路径: