Ошибка 404 при обновлении страницы в SPA (React Router, Vue Router)
Типичная ситуация: SPA на React или Vue работает, переходы между страницами
идут гладко, но стоит обновить внутреннюю страницу (например, /about) —
браузер показывает 404. Разберёмся, почему так и как это чинится.
Почему появляется 404
В одностраничном приложении (SPA) маршрутизацию делает JavaScript в браузере, а
не сервер. Реально на хостинге лежит только один index.html. Когда вы переходите
по ссылке внутри приложения, React Router или Vue Router подменяет адрес в строке,
не обращаясь к серверу.
Но когда вы перезагружаете /about, браузер запрашивает у сервера файл по
этому пути. Такого файла нет — есть только index.html — поэтому сервер отвечает
404.
Решение: фолбэк на index.html
Нужно, чтобы сервер на любой неизвестный путь отдавал index.html, а дальше
роутер сам покажет нужную страницу. Это называется SPA-фолбэк.
На обычном хостинге это настраивается вручную (в nginx — try_files $uri /index.html,
на Apache — через .htaccess).
На Tuqo это работает из коробки
Если в вашей сборке есть index.html и клиентская маршрутизация — Tuqo
автоматически отдаёт index.html на внутренние маршруты. Никакой настройки не
нужно: задеплоили SPA — и перезагрузка /about работает корректно.
npm run build # появится dist/ или build/ с index.html
tar -czf site.tar.gz -C dist .
# деплой — фолбэк на index.html включится сам
Когда нужен настоящий 404
Если у вас многостраничный статический сайт (не SPA), где каждая страница —
отдельный файл, фолбэк на index.html не нужен: несуществующий адрес должен
честно отдавать 404. Tuqo различает эти случаи по структуре сборки.