Перейти к основному содержимому

Страница 404 и SPA-fallback

Когда посетитель открывает URL, которого нет в вашей сборке, Layero должен что-то ответить. Есть два правильных поведения — и они противоположны:

  • Многостраничный статический сайт (Next.js output: 'export', Astro, Hugo, Eleventy, Jekyll…) обычно кладёт в сборку файл 404.html и ждёт, что неизвестный адрес вернёт именно его — с HTTP-кодом 404. Так поисковики (Яндекс, Google) понимают, что страницы нет.
  • SPA с клиентским роутингом (React, Vue, Angular, Solid без пререндера) наоборот хочет, чтобы любой адрес отдавал index.html с кодом 200 — тогда приложение загрузится и его роутер сам покажет нужный экран (или свою 404-заглушку).

Поведение по умолчанию

Layero выбирает автоматически по содержимому сборки:

В корне сборки есть 404.html?Неизвестный URL отдаёт
Да404.html с кодом 404
Нетindex.html с кодом 200 (SPA-fallback)

Для большинства проектов делать ничего не нужно: Next export, Astro, Hugo и подобные генераторы кладут 404.html сами — и он начинает отдаваться с правильным кодом. Vite/CRA-приложения 404.html не создают — и продолжают работать как SPA.

примечание

Сам файл 404.html по прямому адресу (/404.html) всегда доступен с кодом 200 — под 404 попадают только неизвестные URL.

Переопределение через _redirects

Если авто-определение вам не подходит, положите в корень сборки файл _redirects (синтаксис Netlify) с catch-all правилом:

# Форсировать SPA-fallback, даже если 404.html присутствует:
/* /index.html 200

# Или наоборот — явно включить свою страницу 404:
/* /404.html 404
  • /* /index.html 200всегда отдавать index.html с кодом 200. Нужно приложениям с клиентским роутингом, которые при этом почему-то генерируют 404.html.
  • /* /404.html 404 — отдавать указанную страницу с кодом 404. Путь может быть любым (/not-found.html и т.п.), файл должен лежать в сборке.

Правило должно идти последним в _redirects — обычные редиректы (301/302) в том же файле продолжают работать как раньше.

Проверка

curl -I https://ваш-сайт.layero.ru/страница-которой-нет
# HTTP/2 404 ← ожидаемо для статического сайта с 404.html
# HTTP/2 200 ← ожидаемо для SPA

Изменение вступает в силу со следующим деплоем — Layero определяет страницу 404 в момент сборки.