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

Next.js中NextResponse.redirect()首页重定向状态码不生效问题

问题根因

首页返回307和你写的middleware逻辑没有关系,是Next.js内置i18n路由的默认行为导致的:

  • 只要你在next.config.js中开启了i18n配置并设置了defaultLocale,Next.js会自带一层根路径/的重定向逻辑,这层逻辑的执行优先级高于自定义middleware,默认返回307临时重定向,将用户跳转到匹配到的locale(或默认locale)路径
  • 非根路径的请求不会触发这层内置重定向,所以你在middleware中配置的308重定向可以正常生效
  • 你代码里request.nextUrl.locale === "default"的判断逻辑,本来是想在Next.js完成内置locale检测前拦截请求,但根路径的内置重定向触发时机早于middleware执行节点,所以你设置的308状态码直接被覆盖了

修复方案

两种方案都可以实现根路径返回308永久重定向,满足SEO要求:

方案1:关闭Next.js内置locale检测,全量由middleware接管路由

在next.config.js中修改i18n配置,关掉默认的locale检测,避免内置重定向干扰:

// next.config.js
module.exports = {
  i18n: {
    locales: ["en", "zh"], // 替换为你站点支持的所有语言
    defaultLocale: "en",
    localeDetection: false, // 关闭内置locale检测逻辑
  },
}

调整后所有路径(包括根路径)的重定向判断都会走你写的middleware逻辑,308状态码可以正常生效。如果需要根据用户cookie、Accept-Language请求头自动匹配语言,可以直接在middleware里补充对应判断逻辑,替代内置检测能力。

方案2:在配置层添加根路径永久重定向兜底

如果不想改动现有i18n配置和middleware逻辑,直接在next.config.js里加根路径的重定向规则即可,配置层重定向优先级高于内置i18n逻辑:

// next.config.js
module.exports = {
  async redirects() {
    return [
      {
        source: "/",
        destination: "/en",
        permanent: true, // 永久重定向,对应308状态码
        locale: false, // 不对该规则自动追加locale前缀
      },
    ]
  },
  i18n: {
    locales: ["en", "zh"], // 替换为你站点支持的所有语言
    defaultLocale: "en",
  },
}

这种方式配置成本最低,适合不需要根据用户特征动态切换默认语言的站点。

SEO重定向状态码选型参考

针对多语言站点根路径跳转场景:

  • 优先选308永久重定向:和301同属永久重定向类型,搜索引擎会完整传递页面权重,同时308会保留原始请求方法和请求体,不会出现POST请求被重定向为GET的异常
  • 避免使用302、307临时重定向:搜索引擎不会长期传递权重,属于弱排名信号,和你提到的搜索平台规则一致
  • 不要生成重定向链:确保根路径一次重定向直接到最终的带locale路径,不要先跳转到非www、或者其他中间路径再二次跳转,避免权重损耗

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 00:03:19