我已经建立了一个网站,使用 Next.js 和 SSG - 静态站点生成。我在 Apache 服务器上为网站提供服务,因此,由于这个答案,我使用以下 .htaccess 配置:
# Disable directory indexes and MultiViews
Options -Indexes -MultiViews
# Prevent mod_dir appending a slash to directory requests
DirectorySlash Off
# Rewrite /foo to /foo.html if it exists
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.html -f
RewriteRule !\.\w{2,4}$ %{REQUEST_URI}.html [L]
# Otherwise, rewrite /foo to /foo/index.html if it exists
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}/index.html -f
RewriteRule !\.\w{2,4}$ %{REQUEST_URI}/index.html [L]
# Handling 404
ErrorDocument 404 /my-custom-404.html
它一直运行良好。
但最近,需要一个管理页面,即通常的 CRUD。我在没有考虑 SSG 的情况下开发它(因为实际上不需要它),创建了我自己的自定义路由器并使用Next.js 的 catch all routes来处理这个管理页面的所有内容,我称之为dashboard。
因此,在我构建的网站上,我有一大堆page.html
文件和一个/dashboard/[[...dashboard]].html
文件,即 CRUD 本身(所有子页面和内容都是动态导入的) - 因此,每个以开头的链接/dashboard
都将通过该文件处理。
所以,问题是:浏览网站上的链接并进入仪表板,一切正常。但是,如果我尝试直接访问其中的任何链接/dashboard
(例如,包括其自身和 subroutes: /dashboard/users
),它根本不起作用。使用提供的.htaccess
配置,它直接进入 404。
我已经尝试了添加到 .htaccess 的一些不同配置,但到目前为止都没有工作(它仍然直接进入 404,或者浏览器显示错误 ERR_TOO_MANY_REDIRECTS):
RewriteCond %{DOCUMENT_ROOT}/dashboard/$1
RewriteRule (.*) /dashboard/[[...dashboard]].html [L]
这个几乎工作了......但仪表板本身没有做任何事情(没有子页面被渲染):
RewriteCond %{REQUEST_URI} .*dashboard*.
RewriteRule (.*) /dashboard/[[...dashboard]].html [L]
重要提示:整个事情在本地开发服务器上完美运行。
如果有人对我如何解决这个问题有任何提示,我将不胜感激!