使用动态路由将 404 重定向到 Nextjs 中的主页
Redirect 404 to homepage in Nextjs with dynamic routes
我试图将 404 页面重定向到 Nextjs 中的主页,但由于 next.config.js
中的规则,它不起作用。每隔一个 404 重定向到主页,但 /blog/
路由下的任何内容都会转到默认的 Nextjs 错误页面。
例子:
/category-1/post1
重定向到 /blog/category-1/post1
,如果它不存在,则呈现 404 页面但不重定向到主页。
这是我的 _error.js
文件和 404.js
:
import { useEffect } from "react";
import { useRouter } from "next/router";
// export default function Custom404() ->in 404.js<-
export default function _error() {
const router = useRouter();
useEffect(() => {
router.push("/");
}, []);
return null;
}
和我的 next.config.js
文件:
module.exports = {
reactStrictMode: true,
async redirects() {
return [
...oldBlogRedirectRules(),
]
}
// List of old categories
const blogCategoryUrlList = [
"category-1",
"category-2",
]
// Redirect old category and posts to /blog/[category]/[slug]
function oldBlogRedirectRules() {
return blogCategoryUrlList.map((url) => {
return {
source: `/${url}/:slug*`,
destination: `/blog/${url}/:slug*`,
permanent: true,
};
});
}
还有/blog/[category]/[slug].js
中的代码
export default function Blog({ post }) {
const router = useRouter();
if (
!router.isFallback &&
...otherConditions
) {
return <ErrorPage statusCode={404} />;
}
return (
<>
{router.isFallback ? (
<h1>Loading...</h1>
) : (
...whatever
</>
);
}
更新:
@hungdoansy 在评论中回答
自从我在 _error.js
中进行了更改后,我的印象是我不需要进行任何进一步的更改。
要解决此问题,只需从 404.js
文件导入函数:
import Custom404 from 'pages/404.js';
export default function Blog({ post }) {
const router = useRouter();
if (
!router.isFallback &&
...otherConditions
) {
return <Custom404 />;
}
return (
<>
{router.isFallback ? (
<h1>Loading...</h1>
) : (
...whatever
</>
);
}
我试图将 404 页面重定向到 Nextjs 中的主页,但由于 next.config.js
中的规则,它不起作用。每隔一个 404 重定向到主页,但 /blog/
路由下的任何内容都会转到默认的 Nextjs 错误页面。
例子:
/category-1/post1
重定向到 /blog/category-1/post1
,如果它不存在,则呈现 404 页面但不重定向到主页。
这是我的 _error.js
文件和 404.js
:
import { useEffect } from "react";
import { useRouter } from "next/router";
// export default function Custom404() ->in 404.js<-
export default function _error() {
const router = useRouter();
useEffect(() => {
router.push("/");
}, []);
return null;
}
和我的 next.config.js
文件:
module.exports = {
reactStrictMode: true,
async redirects() {
return [
...oldBlogRedirectRules(),
]
}
// List of old categories
const blogCategoryUrlList = [
"category-1",
"category-2",
]
// Redirect old category and posts to /blog/[category]/[slug]
function oldBlogRedirectRules() {
return blogCategoryUrlList.map((url) => {
return {
source: `/${url}/:slug*`,
destination: `/blog/${url}/:slug*`,
permanent: true,
};
});
}
还有/blog/[category]/[slug].js
export default function Blog({ post }) {
const router = useRouter();
if (
!router.isFallback &&
...otherConditions
) {
return <ErrorPage statusCode={404} />;
}
return (
<>
{router.isFallback ? (
<h1>Loading...</h1>
) : (
...whatever
</>
);
}
更新: @hungdoansy 在评论中回答
自从我在 _error.js
中进行了更改后,我的印象是我不需要进行任何进一步的更改。
要解决此问题,只需从 404.js
文件导入函数:
import Custom404 from 'pages/404.js';
export default function Blog({ post }) {
const router = useRouter();
if (
!router.isFallback &&
...otherConditions
) {
return <Custom404 />;
}
return (
<>
{router.isFallback ? (
<h1>Loading...</h1>
) : (
...whatever
</>
);
}