80 lines
2.2 KiB
Markdown
80 lines
2.2 KiB
Markdown
|
|
# CORS 问题解决方案
|
|||
|
|
|
|||
|
|
## 问题描述
|
|||
|
|
|
|||
|
|
当前端(运行在 localhost:3000)尝试访问 graph-rag-agent(运行在 localhost:8000)时,浏览器会阻止请求,因为违反了同源策略。
|
|||
|
|
|
|||
|
|
错误信息:
|
|||
|
|
```
|
|||
|
|
Access to fetch at 'http://localhost:8000/chat/stream' from origin 'http://localhost:3000' has been blocked by CORS policy
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 解决方案
|
|||
|
|
|
|||
|
|
### 方案1:修改 graph-rag-agent 的 CORS 配置(推荐)
|
|||
|
|
|
|||
|
|
我已经修改了 `/home/jzhengda/graph-rag-agent/server/main.py`,添加了 CORS 中间件:
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
from fastapi.middleware.cors import CORSMiddleware
|
|||
|
|
|
|||
|
|
app.add_middleware(
|
|||
|
|
CORSMiddleware,
|
|||
|
|
allow_origins=["*"], # 允许所有源
|
|||
|
|
allow_credentials=True,
|
|||
|
|
allow_methods=["*"],
|
|||
|
|
allow_headers=["*"],
|
|||
|
|
)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**使用方法**:
|
|||
|
|
1. 重启 graph-rag-agent 服务:
|
|||
|
|
```bash
|
|||
|
|
cd ~/graph-rag-agent
|
|||
|
|
# 先停止现有服务 (Ctrl+C)
|
|||
|
|
# 然后重新启动
|
|||
|
|
python -m uvicorn server.main:app --reload --host 0.0.0.0 --port 8000
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 方案2:使用更安全的 CORS 配置
|
|||
|
|
|
|||
|
|
如果需要更安全的配置,可以使用 `main_cors_specific.py`,它只允许特定的源:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cd ~/graph-rag-agent/server
|
|||
|
|
python -m uvicorn main_cors_specific:app --reload --host 0.0.0.0 --port 8000
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 方案3:使用浏览器插件(临时测试)
|
|||
|
|
|
|||
|
|
安装浏览器 CORS 插件(如 "CORS Unblock" 或 "Allow CORS"),仅用于开发测试。
|
|||
|
|
|
|||
|
|
### 方案4:配置反向代理
|
|||
|
|
|
|||
|
|
创建一个简单的反向代理,将前端和后端都代理到同一个端口下。
|
|||
|
|
|
|||
|
|
## 验证 CORS 配置是否生效
|
|||
|
|
|
|||
|
|
1. 重启 graph-rag-agent 后,访问测试页面:
|
|||
|
|
```
|
|||
|
|
http://localhost:3000/test-graph-rag.html
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. 或使用 curl 测试:
|
|||
|
|
```bash
|
|||
|
|
curl -I -X OPTIONS http://localhost:8000/chat \
|
|||
|
|
-H "Origin: http://localhost:3000" \
|
|||
|
|
-H "Access-Control-Request-Method: POST"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
应该看到响应头中包含:
|
|||
|
|
```
|
|||
|
|
Access-Control-Allow-Origin: *
|
|||
|
|
Access-Control-Allow-Methods: *
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 注意事项
|
|||
|
|
|
|||
|
|
1. **生产环境**:不要使用 `allow_origins=["*"]`,应该指定具体的允许域名
|
|||
|
|
2. **开发环境**:当前配置允许所有源,方便开发测试
|
|||
|
|
3. **SSE(服务器发送事件)**:流式响应需要特别注意 CORS 配置
|