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