Vue Router підтримує кілька способів зберігати маршрут в URL.
createWebHistory() - звичайні адреси через History API:
https://example.com/users/7
- красиві URL, які індексують пошукові системи;
- потребує налаштування сервера. Перехід усередині застосунку обробляє JavaScript, але якщо користувач оновить сторінку чи відкриє посилання напряму, браузер запитає в сервера
/users/7. Сервер, який про такий маршрут не знає, поверне 404.
createWebHashHistory() - маршрут після #:
https://example.com/#/users/7
- частина після
#на сервер не надсилається - сервер завжди віддаєindex.html, нічого налаштовувати не треба; - погано для SEO і виглядає застаріло. Доречно для внутрішніх інструментів, статичних хостингів без налаштувань, Electron.
createMemoryHistory() - без URL узагалі: для SSR на сервері й тестів.
Налаштування сервера для createWebHistory - будь-який невідомий шлях віддає точку входу SPA:
location / {
try_files $uri $uri/ /index.html;
}
У Laravel, якщо SPA живе всередині застосунку:
// routes/web.php - останнім, після всіх інших маршрутів
Route::view('/app/{any?}', 'spa')->where('any', '.*');
Пастки:
- справжні 404 зникають: сервер на будь-яку адресу віддає 200 з SPA. Сторінку «не знайдено» робить роутер (
/:pathMatch(.*)*), але HTTP-статус лишається 200 - для SEO це «м'які 404»; - catch-all маршрут має бути останнім і не перехоплювати
/api/*, інакше запити до API отримають HTML; base- якщо застосунок не в корені домену:createWebHistory('/app/'), і той самий префікс у налаштуваннях збирача.