# CORS和Private Network Access问题修复 ## 问题原因 浏览器阻止了从公网IP (`101.43.95.130:8038`) 访问 `localhost:8037` 的请求,这是浏览器的**Private Network Access (PNA)**安全策略。 错误信息: ``` Access to XMLHttpRequest at 'http://localhost:8037/api/v1/auth/register' from origin 'http://101.43.95.130:8038' has been blocked by CORS policy: The request client is not a secure context and the resource is in more-private address space `local`. ``` ## 解决方案 ### 1. 前端API地址自动推断 ✅ 修改了 `frontend/src/api/index.ts`,使其能够: - 检测当前访问的主机名 - 如果是从公网IP访问,自动使用相同的IP地址访问后端 - 例如:前端在 `101.43.95.130:8038`,后端自动使用 `101.43.95.130:8037` ### 2. 后端CORS配置 ✅ 已在后端配置中允许来自 `http://101.43.95.130:8038` 的请求。 ### 3. 后端监听地址 ✅ 确保后端监听在 `0.0.0.0:8000`(容器内),映射到主机的 `8037` 端口。 ## 验证步骤 1. **刷新浏览器页面**(清除缓存) 2. **打开浏览器控制台**,查看是否有新的错误 3. **尝试注册**,应该不再出现CORS错误 ## 如果仍有问题 ### 检查1:后端是否可访问 ```bash # 从服务器测试 curl http://101.43.95.130:8037/health # 应该返回: {"status":"healthy"} ``` ### 检查2:CORS响应头 ```bash curl -X OPTIONS http://101.43.95.130:8037/api/v1/auth/register \ -H "Origin: http://101.43.95.130:8038" \ -H "Access-Control-Request-Method: POST" \ -v ``` 应该看到 `Access-Control-Allow-Origin: http://101.43.95.130:8038` 响应头。 ### 检查3:防火墙 确保服务器的8037端口对外开放: ```bash # 检查端口是否开放 netstat -tlnp | grep 8037 # 或 ss -tlnp | grep 8037 ``` ### 检查4:浏览器控制台 打开浏览器开发者工具(F12),查看: - Network标签:检查实际请求的URL - Console标签:查看是否有新的错误信息 ## 关键点 **重要**:前端从公网IP访问时,**绝对不能**使用 `localhost` 作为后端地址,必须使用相同的公网IP地址。 --- **状态**: ✅ 已修复 **时间**: 2024年