# CORS跨域问题解决方案

## 问题描述
前端从 `localhost:5173` 访问 `company.citupro.com:5500` 的API时出现CORS错误：
```
Access to XMLHttpRequest at 'http://company.citupro.com:5500/api/parse/get-calendar-info?date=2025-08-09' 
from origin 'http://localhost:5173' has been blocked by CORS policy: 
Response to preflight request doesn't pass access control check: 
No 'Access-Control-Allow-Origin' header is present on the requested resource.
```

## 解决方案

### 1. 灵活的CORS配置方案

#### 1.1 创建专门的CORS配置文件
- 文件位置：`app/config/cors.py`
- 提供多种配置方案，支持任意前端地址访问

#### 1.2 配置方案选择
- **方案1 (ALLOW_ALL)**: 允许任意前端地址访问（最灵活，开发环境推荐）
- **方案2 (IP_RANGE)**: 允许特定IP网段访问（生产环境推荐）
- **方案3 (FIXED_LIST)**: 只允许固定的前端地址（最安全）

#### 1.3 更新主应用配置
- 文件位置：`app/__init__.py`
- 使用 `CORS(app, **CORS_OPTIONS)` 配置
- 动态设置Origin头部，支持任意前端地址

### 2. CORS配置详情

#### 2.1 允许的源（Origins）

**当前配置**: 允许任意前端地址访问
```python
# 在 app/config/cors.py 中
ALLOW_ALL_ORIGINS = True  # 启用最灵活的配置

# 支持任意Origin，包括但不限于：
# - http://localhost:5173
# - http://192.168.3.218:5173
# - http://10.0.0.1:3000
# - http://172.16.1.100:8080
# - 以及任何其他前端地址
```

**其他配置选项**:
```python
# 方案2: 允许特定IP网段
ALLOWED_IP_RANGES = [
    "192.168.0.0/16",    # 局域网IP段
    "10.0.0.0/8",        # 内网IP段
    "172.16.0.0/12",     # 内网IP段
]

# 方案3: 固定地址列表
ALLOWED_ORIGINS = [
    "http://localhost:5173",
    "http://your-frontend-ip:port",
]
```

#### 2.2 允许的HTTP方法
```python
ALLOWED_METHODS = [
    "GET", "POST", "PUT", "DELETE", "OPTIONS"
]
```

#### 2.3 允许的请求头
```python
ALLOWED_HEADERS = [
    "Content-Type", "Authorization", "X-Requested-With", 
    "Accept", "Origin", "Cache-Control", "X-File-Name"
]
```

#### 2.4 暴露的响应头
```python
EXPOSED_HEADERS = [
    "Content-Type", "Content-Length", 
    "Content-Disposition", "X-Total-Count"
]
```

### 3. 测试CORS配置

#### 3.1 运行测试脚本
```bash
# 测试灵活CORS配置（推荐）
python test_flexible_cors.py

# 测试特定IP地址
python test_cors_new_ip.py

# 快速验证
python quick_verify_cors.py
```

#### 3.2 测试内容
- **固定Origin测试**: 验证常见前端地址
- **随机Origin测试**: 验证任意前端地址支持
- **CORS预检请求**: 验证OPTIONS请求
- **实际跨域请求**: 验证GET请求
- **动态Origin头部**: 验证响应头设置

### 4. 重启应用

修改CORS配置后，需要重启Flask应用：
```bash
# 如果使用Python直接运行
python application.py

# 如果使用Flask命令
flask run --host=0.0.0.0 --port=5500
```

### 5. 前端配置建议

#### 5.1 确保请求包含正确的头部
```javascript
const response = await fetch('/api/parse/get-calendar-info?date=${date}', {
    method: 'GET',
    headers: {
        'Content-Type': 'application/json',
        'Accept': 'application/json'
    },
    credentials: 'include'  // 如果需要发送cookies
});
```

#### 5.2 处理CORS错误
```javascript
try {
    const response = await fetch(url, options);
    if (!response.ok) {
        throw new Error(`HTTP error! status: ${response.status}`);
    }
    const data = await response.json();
    return data;
} catch (error) {
    if (error.name === 'TypeError' && error.message.includes('CORS')) {
        console.error('CORS错误：请检查服务器配置');
    }
    throw error;
}
```

### 6. 常见问题排查

#### 6.1 检查Flask-CORS版本
确保安装了正确版本的Flask-CORS：
```bash
pip install Flask-CORS==4.0.0
```

#### 6.2 检查防火墙设置
确保服务器防火墙允许5500端口的访问。

#### 6.3 检查代理配置
如果使用Nginx等反向代理，确保代理配置正确转发CORS头部。

### 7. 生产环境配置

在生产环境中，建议：
1. 限制允许的源为实际的前端域名
2. 使用HTTPS
3. 配置适当的CORS缓存时间
4. 监控CORS相关的错误日志

## 验证步骤

1. ✅ 更新CORS配置文件
2. ✅ 重启Flask应用
3. ✅ 运行CORS测试脚本
4. ✅ 在前端测试跨域请求
5. ✅ 检查浏览器开发者工具的网络面板

## 注意事项

- CORS配置修改后必须重启应用才能生效
- 确保前端请求的URL与后端配置的CORS规则匹配
- 如果使用代理或负载均衡器，确保CORS头部被正确传递
- 在生产环境中谨慎配置CORS，避免安全风险
