You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NextJS中next-auth结合next-intl自定义登录页重定向异常

解决NextAuth自定义登录页丢失区域前缀的重定向问题

问题根源

NextAuth配置中pages.signIn设置为固定路径/auth/signin,无法动态适配多语言区域前缀(如en/),导致登录页内的NextAuth自动生成链接、重定向URL丢失locale信息,引发区域文件预加载失败。

解决方案

1. 动态生成带区域前缀的SignIn页面路径

修改src/pages/api/auth/[...nextauth].js,根据当前请求的locale动态拼接登录页路径:

import NextAuth from "next-auth";
// 导入你的身份验证提供商
import CredentialsProvider from "next-auth/providers/credentials";

export default NextAuth({
  providers: [
    CredentialsProvider({
      // 你的提供商配置逻辑
    })
  ],
  pages: {
    // 动态生成带locale的登录页路径
    signIn: (req) => {
      // 从请求中获取当前locale(根据你的项目locale存储方式调整,比如cookie、路由参数)
      const locale = req.query.locale || req.cookies.NEXT_LOCALE || "en";
      return `/${locale}/auth/signin`;
    }
  },
  callbacks: {
    // 修正callbackUrl的区域前缀
    async redirect({ url, baseUrl }) {
      // 检查url是否已包含有效locale前缀
      const validLocales = ["en", "zh"]; // 替换为你的项目支持的locale列表
      const urlSegments = new URL(url).pathname.split("/");
      const hasValidLocale = validLocales.includes(urlSegments[1]);

      if (!hasValidLocale) {
        // 从请求或默认值获取当前locale,补全到callbackUrl
        const currentLocale = req.query.locale || "en";
        return `${baseUrl}/${currentLocale}${new URL(url).pathname}${new URL(url).search}`;
      }
      return url.startsWith(baseUrl) ? url : baseUrl;
    }
  }
});

2. 登录页内强制使用带区域前缀的路由

在自定义登录页src/pages/auth/signin.js中,通过useRouter获取当前locale,手动拼接所有跳转路径:

import { useRouter } from "next/router";
import { signIn } from "next-auth/react";
import Link from "next/link";

export default function SignInPage() {
  const router = useRouter();
  const { locale } = router;

  return (
    <div className="sign-in-container">
      {/* 登录按钮:指定带locale的callbackUrl */}
      <button 
        onClick={() => signIn("credentials", {
          callbackUrl: `/${locale}/about`,
          // 其他登录参数
        })}
      >
        登录
      </button>

      {/* 页面内跳转链接:强制带locale前缀 */}
      <Link href={`/${locale}/home`}>返回首页</Link>
      <Link href={`/${locale}/help`}>帮助中心</Link>
    </div>
  );
}

3. 确保Next.js多语言配置正确

在next.config.js中确认i18n配置生效,保证locale能被路由正确识别:

module.exports = {
  i18n: {
    locales: ["en", "zh"],
    defaultLocale: "en",
    localeDetection: true // 自动检测用户语言
  }
};

内容的提问来源于stack exchange,提问作者Marco Rovida

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 04:02:15