NextJS Optional 捕获所有部署时不工作的路由

NextJS Optional catch all routes not working when deployed

我们有一个包含一个动态路由 [productId] 的项目,在此页面内,我们还有其他几个页面包含可选的全包路由。以下是页面文件夹的结构:

[productId]
  contentOne
    [[...slugOne]]
 

问题是,只要页面是静态生成的,可选的 catch-all 就不能正常工作。前任: productId/contentOne 不起作用,但是 productOne/contentOne/extra 有效 只有部署在vercel中才会出现这个问题。所有路线在本地都能完美运行。

这里是 getStaticPaths:

export async function getStaticPaths() {    
  return {    
    paths: [],    
     fallback: true,    
   }    
 } 

这里是 getStaticProps:

export async function getStaticProps({ locale }) {
  return {
    props: {
      test: 'test',
      ...(await serverSideTranslations(locale, ['common'])),
    }
  }
}

当使用 getStaticPaths 生成页面时,设置 { fallback: true } does not result in a 404. During development, it works because development uses a version of Automatic Static Optimization Next 将提供服务器呈现的站点,即使页面将是静态的。

如果您是 运行 具有 Next 的 SSR 站点,则设置 fallback 将提供一个带有空属性的静态页面。这是预期的行为(如果这是您正在发生的事情),您有责任通过重定向客户端或显示您自己的 404 类型或缺失内容页面来处理该页面。

如果您正在使用 next export 构建和导出页面,那么设置 fallback 不会执行任何操作(使用 next export 时的预期行为),这意味着该页面刚刚获胜不存在并且您的服务器应该通过提供 404 错误页面或将用户重定向到其他地方来处理 404。

我不确定您所说的“不起作用”是什么意思 - 是给您 404 错误还是空白页?无论哪种方式,以上就是原因。

我们有一个未解决的问题:https://github.com/vercel/next.js/issues/30631

与此同时,我们不得不使用重写(这进入 next.config 文件):

async rewrites() {
return {

  beforeFiles: [

   {
     source: '/:productId/contentOne',
     destination: '/:productId/contentOne/index'
   }
  ]
}