Next.js使用deufakt i18n时关闭/blog路由本地化及构建报错求助
为/blog路由关闭deufakt i18n本地化的解决方案
- 首选配置重定向规则,直接在
next.config.js中添加如下配置,所有带语言前缀的博客路径会自动301跳转到无前缀路径:
module.exports = { // 其余原有配置保留 async redirects() { return [ { source: '/:lang(你支持的所有语言码用|分隔,比如en|es|fr)/blog/:path*', destination: '/blog/:path*', permanent: true, }, ] }, }
- 同时在deufakt i18n的配置文件中添加路由排除规则,避免插件处理博客路径:找到插件配置项中的
excludeRoutes数组,加入'/blog'和'/blog/**'即可。
构建阶段post为undefined的报错解决方案
本地开发正常但构建报错,核心原因是构建阶段的接口请求逻辑和开发环境不一致,可按以下步骤排查修复:
- 添加兜底判断避免直接报错
你当前的逻辑中如果pageData为空会返回空props,组件直接访问post.metadata必然触发报错,先修改组件代码添加兜底:
const BlogPage = ({ post, allPosts }) => { const router = useRouter(); if (router.isFallback) { return <div className="container">Loading...</div>; } // 新增post不存在时返回404 if (!post) { return <ErrorPage statusCode={404} /> } return ( <> <Seo metadata={post.metadata} /> <BlogPost {...{ post, allPosts }} /> </> ); };
- 排查构建环境接口请求问题
- 确认构建环境的环境变量配置正确,
getStrapiURL返回的是Strapi服务的公网可访问地址,不要用localhost或者内网IP,避免构建机无法访问接口。 - 在
getStaticProps中添加日志打印,构建时查看接口请求参数和返回值,确认是否存在请求失败、返回空数据的问题:
export async function getStaticProps({ params, preview = null }) { console.log('当前请求slug:', params.slug) console.log('请求接口地址:', getStrapiURL(`/blog-posts?slug=${params.slug}`)) const pageData = await getBlogPost(params.slug); console.log('接口返回内容:', pageData) // 其余原有逻辑保留 }
- 排除i18n参数影响
deufakt i18n默认会给getStaticProps传入locale参数,确认你的getBlogPost方法是否按locale过滤了内容,如果是,修改该方法,博客相关请求忽略locale参数,或者默认请求全量/默认语言的内容。
同时修改getStaticPaths中的接口请求,添加参数强制返回所有语言的博客slug,避免构建阶段生成路径不全:
export async function getStaticPaths() { // 示例:Strapi请求添加_locale=all返回全量数据,具体参数按你所用的Strapi版本调整 const blogPosts = await (await fetch(getStrapiURL("/blog-posts?_locale=all"))).json(); const paths = blogPosts.map((page) => { return { params: { slug: page.slug }, }; }); return { paths, fallback: true }; }
内容的提问来源于stack exchange,提问作者Filip
相关产品推荐
相关产品推荐

