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