TDLR;
在静态导出next.js应用(next build && next export
)而不使用getStaticPaths
的情况下,如何成功重新加载动态路由?
当我使用React-app和react-router时,我不得不在/public
文件夹中添加以下.htaccess
文件,该文件将被复制/粘贴到输出/build
文件夹中
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule . /index.html [L]
</IfModule>
它允许从任何路由重新加载的任何页面重定向到应用程序内的正确路由,而不是404。
使用Next.js * 作为连接到外部API* 的静态站点,动态路由的这种行为似乎有点复杂。我不能用getStaticPaths
生成动态路由,因为我无法预测这些路径。
我的网页是一个测验,你可以看到你的结果,如果你愿意分享他们。
- 一个页面
/result
这是我的私人结果,当我登录 - 一个页面
/result/[anyName]
,这将是公共结果
在没有403或404的情况下,很难使页面重新加载正常工作。
- 在.
RewriteRule ^result/(.*)$ /result [R=301,NC,L]
->中添加RewriteRule无效 - 在
next.config.js
->中添加exportPathMap
不起作用。
const moduleExports = {
reactStrictMode: true,
exportPathMap: () => ({
"/": { page: "/" },
"/result/arnaud": { page: "/result" },
}),
images: {
loader: "imgix",
path: "",
},
trailingSlash: true,
};
我最终做的是一个技巧:在我的页面根目录的index.js
中,显示路径/
:
const router = useRouter();
useEffect(() => {
if (router.asPath?.includes("result") && router.asPath?.split("/").length > 1) {
router.push(router.asPath);
}
}, [router.asPath]);
它实际上是在做这件事,但我不太喜欢这样,用一个可靠的.htaccess
要容易得多,我可以盲目地从一个项目复制粘贴到另一个项目。
有更好的吗?
1条答案
按热度按时间oxf4rvwz1#
我认为最好的方式为正常路线是:
打开
next.config.js
并添加trailingSlash
配置:更多信息:https://nextjs.org/docs/app/api-reference/next-config-js/trailingSlash
对于动态路由,应该为每个动态路由添加一个
.htaccess
文件,例如:假设这是动态路由构建后的结构:
在
product
文件夹中添加一个.htaccess
文件,如下所示: