# 修复重定向端口丢失问题 ## 问题描述 访问 `http://156.225.27.52:5245` 时: 1. 应用返回 307 重定向到 `/api/auth/guest` 2. 重定向后的 URL 变成 `http://156.225.27.52`(端口号丢失) 3. 浏览器访问 80 端口,被 Nginx 拦截返回 404 ## 问题原因 NextAuth 的 `signIn` 函数在重定向时,如果没有正确配置 `AUTH_URL` 环境变量,会使用请求的 origin,但可能会丢失端口号。 ## 修复方案 ### 方案 1: 修复代码(已实施) 修改 `app/(auth)/api/auth/guest/route.ts`: - 确保重定向时使用正确的 base URL(包含端口) - 优先使用 `AUTH_URL` 环境变量 - 如果 `AUTH_URL` 未设置,使用请求的 origin(包含端口) ### 方案 2: 设置环境变量 在服务器上设置环境变量: ```bash export AUTH_URL=http://156.225.27.52:5245 export NEXT_PUBLIC_BASE_URL=http://156.225.27.52:5245 ``` 或者在 `.env.local` 文件中: ```bash AUTH_URL=http://156.225.27.52:5245 NEXT_PUBLIC_BASE_URL=http://156.225.27.52:5245 ``` ## 部署步骤 1. **更新代码** ```bash git pull # 或上传修复后的文件 ``` 2. **设置环境变量**(如果使用方案2) ```bash # 编辑 .env.local echo "AUTH_URL=http://156.225.27.52:5245" >> .env.local echo "NEXT_PUBLIC_BASE_URL=http://156.225.27.52:5245" >> .env.local ``` 3. **重启应用** ```bash pm2 restart ai-chatbot # 或 pm2 delete ai-chatbot pm2 start npm --name ai-chatbot -- start ``` ## 验证 访问 `http://156.225.27.52:5245`,应该: 1. 正确重定向到 `/api/auth/guest` 2. 重定向 URL 包含端口号 5245 3. 最终能够正常访问应用 ## 技术细节 ### 修改的代码逻辑 1. **获取 base URL**: ```typescript const baseUrl = process.env.AUTH_URL || requestUrl.origin; ``` - 优先使用 `AUTH_URL` 环境变量 - 如果未设置,使用请求的 origin(包含端口) 2. **处理相对路径重定向**: ```typescript if (redirectUrl.startsWith("/")) { const baseUrl = process.env.AUTH_URL || requestUrl.origin; finalRedirectUrl = new URL(redirectUrl, baseUrl).toString(); } ``` - 将相对路径转换为绝对路径 - 确保包含正确的端口号 ## 注意事项 1. **环境变量优先级**: `AUTH_URL` 环境变量优先于请求 origin 2. **端口一致性**: 确保 `AUTH_URL` 中的端口与 FRPC 穿透端口一致 3. **HTTPS**: 如果将来使用 HTTPS,需要更新 `AUTH_URL` 为 `https://` ## 相关文件 - `app/(auth)/api/auth/guest/route.ts` - 修复的重定向逻辑 - `proxy.ts` - 初始重定向逻辑(已正确使用 request.url) - `.env.local` - 环境变量配置(可选)