Правильные настройки .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 запроса содержит "панель управления"
- И если тот же запрос не содержит [[... панель управления]]
- ТОГДА переписываю в файл дашборда
Надеюсь, это когда-нибудь поможет кому-нибудь!