Files
chinese-family-tree-2/问题修复总结.md
T
freedakgmail b7a8c9ee6e 0.0.8.3
2025-11-24 08:11:15 +08:00

5.3 KiB

重定向循环问题修复总结

问题现象

在远程服务器 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

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

脚本会引导您完成所有修复步骤。

方法二: 手动修复

  1. SSH登录服务器

    ssh -p 8006 root@115.190.235.230
    
  2. 编辑 .env 文件

    cd /var/www/chinese-family-tree
    nano .env
    
  3. 修改 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"
    
  4. 重启应用

    pm2 restart chinese-family-tree
    
  5. 清除浏览器缓存

    • 按 F12 打开开发者工具
    • 右键点击刷新按钮
    • 选择"清空缓存并硬性重新加载"

关键要点

⚠️ NEXTAUTH_URL 配置规则

  1. 必须与用户访问URL完全一致

    • 用户访问 http://115.190.235.230:8006NEXTAUTH_URL="http://115.190.235.230:8006"
    • 用户访问 http://115.190.235.230:8006NEXTAUTH_URL="http://115.190.235.230:3000"
  2. 必须包含完整信息

    • 包含协议: http://https://
    • 包含端口: :3000:8006
    • 不要使用: localhost127.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. 检查配置

    ssh -p 8006 root@115.190.235.230 'cd /var/www/chinese-family-tree && grep NEXTAUTH_URL .env'
    
  2. 检查应用状态

    ssh -p 8006 root@115.190.235.230 'pm2 status'
    
  3. 查看日志

    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完全一致,即可解决问题。

修复后,用户需要清除浏览器缓存才能看到效果,因为浏览器已经缓存了之前的错误重定向响应。