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 配置 |