0

我已经建立了一个网站,使用 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]

重要提示:整个事情在本地开发服务器上完美运行。

如果有人对我如何解决这个问题有任何提示,我将不胜感激!

4

1 回答 1

0

我已经设法解决它,至少在可接受的水平上。

正如我在问题中提到的那样,这几乎可以正常工作(没有渲染任何子页面,但至少浏览器正确重定向到仪表板):

RewriteCond %{REQUEST_URI} .*dashboard*.
RewriteRule (.*) /dashboard/[[...dashboard]].html [L]

没有呈现任何页面,因为我使用 Next.js 的withRouter/useRouter来通知我的自定义路由器当前路由(通过router.asPath),并且当满足上述规则时,router.asPath 设置为dashboard/[[...dashboard]].html. 因此,我编写了一个小测试,将使用 asPath 的任何访问重定向到我的入口点。基本上:

if(router.asPath.contains('[[...dashboard]]')
    router.push('/dashboard')

但是,另一个问题引起了……第一个问题得到了解决:尝试直接访问任何仪表板路由都可以正常工作,但浏览网站(链接)却不行。经过艰苦而漫长的试错过程,我发现我以前的 .htaccess 规则阻止了我的客户端代码请求我的 [[...dashboard]].html 文件。

RewriteCond %{REQUEST_URI} .*dashboard*.
RewriteCond %{REQUEST_URI} !(\[\[\.\.\.dashboard\]\])
RewriteRule (.*) /dashboard/[[...dashboard]].html?p=$1 [L]

基本上:

  • 如果我的请求 URI 包含“仪表板”
  • 并且如果相同的请求不包含 [[...dashboard]]
  • 然后我将它重写到仪表板文件

希望有一天这可能对某人有所帮助!

于 2021-03-21T17:20:24.783 回答