198 lines
5.3 KiB
Markdown
198 lines
5.3 KiB
Markdown
# 重定向循环问题修复总结
|
|
|
|
## 问题现象
|
|
|
|
在远程服务器 `http://115.190.235.230:8006` 访问部署的系统时:
|
|
- ❌ 正常浏览器: 报错 `ERR_TOO_MANY_REDIRECTS` (重定向次数过多)
|
|
- ✅ 无痕浏览器: 可以正常访问
|
|
|
|
## 根本原因
|
|
|
|
**NextAuth URL 配置不匹配导致的重定向循环**
|
|
|
|
1. **配置问题**: 服务器 `.env` 文件中的 `NEXTAUTH_URL` 与用户实际访问的URL不一致
|
|
2. **缓存问题**: 正常浏览器缓存了错误的重定向响应
|
|
3. **无痕模式正常**: 无痕浏览器不使用缓存,所以能正常工作
|
|
|
|
从错误日志可以看到资源路径被错误拼接:
|
|
```
|
|
:8006/115.190.235.23...0e7184ad3a13f.css
|
|
```
|
|
|
|
这说明NextAuth在生成重定向URL时使用了错误的基础URL。
|
|
|
|
## 已完成的修复
|
|
|
|
### 1. 代码层面修复
|
|
|
|
#### ✅ 更新 `next.config.mjs`
|
|
```javascript
|
|
const nextConfig = {
|
|
output: 'standalone', // 生产环境优化
|
|
images: {
|
|
unoptimized: true,
|
|
},
|
|
// 确保在反向代理环境下正确处理资源路径
|
|
assetPrefix: process.env.ASSET_PREFIX || undefined,
|
|
}
|
|
```
|
|
|
|
**作用**:
|
|
- `output: 'standalone'` 优化生产环境部署
|
|
- `assetPrefix` 确保静态资源路径在反向代理环境下正确
|
|
|
|
### 2. 创建修复文档和工具
|
|
|
|
#### ✅ `REDIRECT_LOOP_FIX.md`
|
|
详细的问题分析和修复指南,包括:
|
|
- 问题原因分析
|
|
- 完整的修复步骤
|
|
- 环境变量配置说明
|
|
- Nginx反向代理配置
|
|
- 常见错误示例
|
|
|
|
#### ✅ `fix-redirect-loop.sh`
|
|
自动化修复脚本,可以:
|
|
- 检查当前服务器配置
|
|
- 交互式选择正确的URL
|
|
- 自动更新服务器配置
|
|
- 重启应用
|
|
- 显示后续操作指南
|
|
|
|
#### ✅ 更新 `DEPLOY_GUIDE.md`
|
|
在部署指南中添加了关于 `NEXTAUTH_URL` 的重要警告和说明。
|
|
|
|
## 如何修复
|
|
|
|
### 方法一: 使用自动化脚本 (推荐)
|
|
|
|
```bash
|
|
./fix-redirect-loop.sh
|
|
```
|
|
|
|
脚本会引导您完成所有修复步骤。
|
|
|
|
### 方法二: 手动修复
|
|
|
|
1. **SSH登录服务器**
|
|
```bash
|
|
ssh -p 8006 root@115.190.235.230
|
|
```
|
|
|
|
2. **编辑 .env 文件**
|
|
```bash
|
|
cd /var/www/chinese-family-tree
|
|
nano .env
|
|
```
|
|
|
|
3. **修改 NEXTAUTH_URL**
|
|
|
|
如果用户通过 `http://115.190.235.230:8006` 访问:
|
|
```env
|
|
NEXTAUTH_URL="http://115.190.235.230:8006"
|
|
```
|
|
|
|
如果用户通过 `http://115.190.235.230:3000` 访问:
|
|
```env
|
|
NEXTAUTH_URL="http://115.190.235.230:3000"
|
|
```
|
|
|
|
4. **重启应用**
|
|
```bash
|
|
pm2 restart chinese-family-tree
|
|
```
|
|
|
|
5. **清除浏览器缓存**
|
|
- 按 F12 打开开发者工具
|
|
- 右键点击刷新按钮
|
|
- 选择"清空缓存并硬性重新加载"
|
|
|
|
## 关键要点
|
|
|
|
### ⚠️ NEXTAUTH_URL 配置规则
|
|
|
|
1. **必须与用户访问URL完全一致**
|
|
- ✅ 用户访问 `http://115.190.235.230:8006` → `NEXTAUTH_URL="http://115.190.235.230:8006"`
|
|
- ❌ 用户访问 `http://115.190.235.230:8006` → `NEXTAUTH_URL="http://115.190.235.230:3000"`
|
|
|
|
2. **必须包含完整信息**
|
|
- ✅ 包含协议: `http://` 或 `https://`
|
|
- ✅ 包含端口: `:3000` 或 `:8006`
|
|
- ❌ 不要使用: `localhost` 或 `127.0.0.1`
|
|
|
|
3. **不同部署场景的配置**
|
|
|
|
| 场景 | 用户访问URL | NEXTAUTH_URL |
|
|
|------|------------|--------------|
|
|
| 直接访问应用端口 | `http://115.190.235.230:3000` | `http://115.190.235.230:3000` |
|
|
| Nginx反向代理 | `http://115.190.235.230:8006` | `http://115.190.235.230:8006` |
|
|
| 使用域名 | `http://example.com` | `http://example.com` |
|
|
| 使用HTTPS | `https://example.com` | `https://example.com` |
|
|
|
|
## 验证修复
|
|
|
|
1. **检查配置**
|
|
```bash
|
|
ssh -p 8006 root@115.190.235.230 'cd /var/www/chinese-family-tree && grep NEXTAUTH_URL .env'
|
|
```
|
|
|
|
2. **检查应用状态**
|
|
```bash
|
|
ssh -p 8006 root@115.190.235.230 'pm2 status'
|
|
```
|
|
|
|
3. **查看日志**
|
|
```bash
|
|
ssh -p 8006 root@115.190.235.230 'pm2 logs chinese-family-tree --lines 50'
|
|
```
|
|
|
|
4. **测试访问**
|
|
- 先用无痕浏览器测试
|
|
- 清除正常浏览器缓存后测试
|
|
|
|
## 预防措施
|
|
|
|
1. **部署前检查清单**
|
|
- [ ] 确认用户访问URL
|
|
- [ ] 正确配置 `NEXTAUTH_URL`
|
|
- [ ] 如果使用Nginx,确认反向代理配置正确
|
|
- [ ] 测试无痕模式和正常模式
|
|
|
|
2. **配置管理**
|
|
- 为不同环境准备不同的 `.env` 文件
|
|
- 在部署脚本中添加配置验证
|
|
- 定期检查应用日志
|
|
|
|
3. **文档维护**
|
|
- 记录实际的访问URL
|
|
- 更新部署文档
|
|
- 保存配置备份
|
|
|
|
## 相关文件
|
|
|
|
- `REDIRECT_LOOP_FIX.md` - 详细的修复指南
|
|
- `fix-redirect-loop.sh` - 自动化修复脚本
|
|
- `DEPLOY_GUIDE.md` - 部署指南(已更新)
|
|
- `next.config.mjs` - Next.js配置(已优化)
|
|
|
|
## 技术说明
|
|
|
|
NextAuth v4 的工作原理:
|
|
1. 从 `NEXTAUTH_URL` 环境变量读取基础URL
|
|
2. 生成认证相关的回调URL和重定向URL
|
|
3. 如果基础URL与实际访问URL不匹配,会导致:
|
|
- 重定向到错误的URL
|
|
- 浏览器缓存错误的重定向
|
|
- 形成重定向循环
|
|
|
|
这就是为什么:
|
|
- 无痕浏览器可以工作(没有缓存)
|
|
- 正常浏览器不能工作(有错误缓存)
|
|
- 清除缓存后可以恢复正常
|
|
|
|
## 总结
|
|
|
|
这是一个典型的**配置不匹配导致的重定向循环问题**。通过正确配置 `NEXTAUTH_URL` 环境变量,使其与用户实际访问的URL完全一致,即可解决问题。
|
|
|
|
修复后,用户需要清除浏览器缓存才能看到效果,因为浏览器已经缓存了之前的错误重定向响应。
|