Правильные настройки .htaccess для Next.js SSG перехватывают все маршруты

Я создал веб-сайт, используя Next.js и SSG - Static Site Generation. Я обслуживаю веб-сайт на сервере 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 для обработки всего содержимого этой страницы администратора, которую я назвал дашбордом .

Итак, на моем созданном веб-сайте у меня есть целая куча page.html файлы и /dashboard/[[...dashboard]].html файл, который является самим CRUD (все подстраницы и содержимое импортируются динамически) - и, следовательно, каждая отдельная ссылка, начинающаяся с, будет обрабатываться через этот файл.

Итак, проблема в том, что при переходе по ссылкам на сайте и в панели управления все работает отлично. Но если я попытаюсь получить прямой доступ к любой ссылке в /dashboard (включая себя и подмаршруты: /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]

Важное примечание: все это отлично работает на локальном сервере разработки.

Если у кого-нибудь есть совет, как я могу разобраться в этом, я был бы очень признателен!

1 ответ

Решение

Мне удалось ее решить, по крайней мере, на приемлемом уровне.

Как я уже упоминал в вопросе, это почти работало (ни одна подстраница не отображалась, но, по крайней мере, браузер правильно перенаправлял на панель инструментов):

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

Страница никогда не отображалась, потому что я использовал withRouter / useRouter Next.js, чтобы сообщить своему настраиваемому маршрутизатору текущий маршрут (через router.asPath), и когда вышеупомянутое правило выполнено, router.asPath был установлен в dashboard/[[...dashboard]].html. Итак, я написал небольшой тест, чтобы перенаправить любой доступ с этим asPath к моей точке входа. По сути:

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

Но возникает другая проблема ... Первая проблема была решена: попытка прямого доступа к любым маршрутам панели управления работала, а переход по веб-сайту (ссылки) - нет. После трудного и долгого процесса проб и ошибок я обнаружил, что мое предыдущее правило .htaccess не позволяло моему клиентскому коду запрашивать мой [[... приборную панель]] .html файл.

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

По сути:

  • Если мой URI запроса содержит "панель управления"
  • И если тот же запрос не содержит [[... панель управления]]
  • ТОГДА переписываю в файл дашборда

Надеюсь, это когда-нибудь поможет кому-нибудь!

Другие вопросы по тегам