Как развернуть Vite React SPA на Plesk: фикс 404 ошибок
Пошаговое руководство по развертыванию SPA на React 19 с Vite на Plesk. Решение проблем с Application Startup File в Node.js и react router 404 при обновлении страниц через .htaccess и статический хостинг dist.
Как развернуть SPA-приложение на React 19 с Vite на сервере Plesk? Решение проблем с ‘Application Startup File’ в Node.js расширении и 404 ошибками на маршрутах react-router-dom при обновлении страниц.
Стандартный проект Vite + React использует react-router-dom v7 для клиентской маршрутизации, без кастомного бэкенда (нет server.js). После npm run build генерируется папка dist.
Проблемы:
- Node.js расширение Plesk требует ‘Application Startup File’, но в
package.jsonтолько скриптыvite(dev, build, preview). - При указании document root на
distвсе маршруты (например,/contact) дают 404 при обновлении.
Конфигурация:
package.json: скриптыdev: vite,build: vite build; зависимости React 19, react-router-dom ^7.9.6, Vite ^7.2.2.vite.config.js: стандартный с@vitejs/plugin-react.
Вопросы:
- Нужно ли включать Node.js поддержку в Plesk для Vite SPA или достаточно обслуживать
distкак статические файлы? - Если статика, как настроить history fallback для react-router-dom (чтобы избежать 404 на рефреше) с помощью
.htaccessили Nginx-директив в Plesk? - Или требуется создать простой Node.js сервер для раздачи статических ассетов при использовании Node.js расширения?
Для развертывания SPA на React 19 с Vite на Plesk не нужно включать Node.js расширение — достаточно настроить статический хостинг папки dist после npm run build. Проблема с ‘Application Startup File’ решается отказом от Node.js, а react router 404 при обновлении страниц устраняется через .htaccess с history fallback, перенаправляющим все запросы на index.html. Это стандартный vite deploy plesk для клиентской маршрутизации react-router-dom v7 без бэкенда.
Содержание
- Развертывание Vite + React SPA на Plesk: основные проблемы
- Настройка статического хостинга для Vite приложения в Plesk
- Решение проблемы 404 ошибок с react-router-dom через .htaccess
- Альтернативные подходы: HashRouter и настройка базового пути
- Когда использовать Node.js расширение в Plesk для SPA приложений
- Источники
- Заключение
Развертывание Vite + React SPA на Plesk: основные проблемы
Представьте: собрали vite react plesk проект командой npm run build, залили dist на сервер, а при рефреше на /contact — бац, 404. Почему так? SPA с react-router-dom v7 работает на клиентской маршрутизации: браузер сам решает, что показывать по пути /contact. Но сервер Plesk ищет файл contact.html — его нет, вот и ошибка.
А ‘Application Startup File’ в Node.js расширении? Оно требует server.js или подобного для запуска Node-приложения. Ваш стандартный package.json с vite build и vite preview — это не сервер, а билдер статики. Включать Node.js для простого SPA — перебор, ресурсы жрет зря. Большинство разработчиков на Stack Overflow жалуются на то же: Plesk путает статический хостинг с полноценным Node-сервером.
Коротко: 90% vite deploy plesk сводится к статике + fallback. Давайте разберем по шагам.
Настройка статического хостинга для Vite приложения в Plesk
Сначала билд. В корне проекта:
npm run build
Появится dist с index.html, JS/CSS бандлами. Залейте её в Plesk через File Manager или FTP в httpdocs (или поддомен).
В панели Plesk:
- Домены > ваш домен > Настройки хостинга.
- Document root: укажите
/httpdocs/dist(или где залили). - Тип хостинга: “Без PHP” или “Статический контент” — забудьте Node.js.
- Apache & nginx Settings: включите поддержку .htaccess.
Почему статика? Документация Vite прямо говорит: после билда — это обычные файлы для любого веб-сервера. React 19 + Vite ^7.2.2 генерит оптимизированный dist, готовый к Netlify, Vercel или Plesk. Без сервера — дешевле, быстрее, проще.
Тестируйте: главная / работает? Отлично. Теперь рефреш на маршрутах — и привет, 404. Переходим к фиксу.
Решение проблемы 404 ошибок с react-router-dom через .htaccess
Вот где магия. Создайте .htaccess в корне dist (рядом с index.html):
RewriteEngine On
# Если файл или папка существуют — отдаем их
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
# Иначе — fallback на index.html для SPA
RewriteRule ^ /index.html [L]
Загрузите, очистите кэш Plesk (Domains > Hosting Settings > Clear Cache). Теперь рефреш на /contact — сервер кидает всё на index.html, React Router сам разберется.
Если Nginx в Plesk (проверьте в Apache & nginx Settings):
location / {
try_files $uri $uri/ /index.html;
}
Добавьте в Additional nginx directives. Готово! Это классический history fallback spa для react router 404. Работает на Apache/Nginx, без хаков.
А если в подпапке, типа /app/? Добавьте basename="/app" в <BrowserRouter> в main.jsx.
Альтернативные подходы: HashRouter и настройка базового пути
Не хотите ковырять сервер? Перейдите на <HashRouter> в react-router-dom. Замените BrowserRouter на HashRouter — URL станут /#!/contact. Серверу плевать, fallback не нужен. Минус: хэш в адресной строке выглядит старомодно, но для MVP сойдет.
Из блога Muffin Man: для субпапок — basename + .htaccess с путем:
RewriteRule ^/subfolder/(.*)$ /subfolder/index.html [L]
В vite.config.js тоже можно base: '/subfolder/' для билда. Но для рута Plesk хватит стандартного.
Еще трюк: файл _redirects (без точки!) в dist/public:
/* /index.html 200
Plesk его подхватит как правило редиректа. Быстро, без правки конфигов.
Когда использовать Node.js расширение в Plesk для SPA приложений
Только если нужен SSR (Server-Side Rendering) или API на сервере. Для вашего случая — нет. Но если упорствуетесь:
- Установите Node.js в Plesk (Extensions > Node.js).
- Application Startup File: создайте
server.js:
const express = require('express');
const path = require('path');
const app = express();
app.use(express.static('dist'));
app.get('*', (req, res) => res.sendFile(path.join(__dirname, 'dist/index.html')));
app.listen(process.env.PORT || 3000);
package.json: добавьте"start": "node server.js", укажитеserver.jsв Startup File.
Заливка через Git или npm install. Но зачем? Статика быстрее, дешевле. Node.js для plesk nodejs deploy — оверкилл для чистого фронта.
Источники
- Stack Overflow — Решение развертывания Vite React на Plesk без Node.js и фикс 404: https://stackoverflow.com/questions/79876969/deploying-vite-react-app-on-plesk-application-startup-file-missing-or-404-o
- Muffin Man — Настройка React Router с .htaccess и basename для субпапок: https://muffinman.io/blog/react-router-subfolder-on-server/
- Vite Documentation — Официальное руководство по статическому деплою Vite SPA приложений: https://vite.dev/guide/static-deploy.html
Заключение
Развернуть vite react plesk проще простого: билд dist как статику, .htaccess для react router 404 — и никаких ‘Application Startup File’. Забудьте Node.js, если нет SSR. Это сэкономит время и ресурсы. Тестируйте на staging, и ваше SPA на React 19 взлетит. Если субпапки или кастом — HashRouter в помощь. Удачи с деплоем!
Проблема 404 ошибок при обновлении страниц в SPA приложениях возникает потому, что у них есть только один файл index.html, и когда браузер ищет другие URL (например, /contacts), соответствующего файла на сервере нет.
Для решения этой проблемы в папке /public нужно создать файл _redirects (без расширения) со следующим содержимым:
/* /index.html 200
Это заставляет сервер перенаправлять все запросы на index.html. При этом в браузере URL остается прежним, но React загружает интерфейс из index.html. Для Vite + React приложений в Plesk достаточно обслуживать папку dist как статические файлы, без необходимости включать Node.js поддержку.
Для развертывания React Router приложения в подпапке на сервере есть два основных решения.
Первый способ - использовать HashRouter вместо BrowserRouter. Это решает проблему с маршрутизацией без дополнительных настроек сервера, но добавляет /# в URL.
Второй способ - вручную указать базовый путь с помощью свойства basename в React Router: <BrowserRouter basename="/path/to/subfolder/">.
Для настройки .htaccess файла нужно добавить правила перенаправления:
RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]
RewriteRule ^ /path/to/subfolder/index.html [L]
Это решит проблему 404 ошибок при обновлении страниц.
Документация Vite описывает процесс развертывания статических сайтов, собранных с помощью Vite.
После выполнения команды npm run build в проекте создается папка dist, которую можно развернуть на любом статическом хостинге.
Для Vite SPA приложений не требуется серверный рендеринг, и они могут обслуживаться как обычные статические файлы. Однако при использовании клиентской маршрутизации (как в react-router-dom) необходимо настроить перенаправление всех запросов на index.html для избежания 404 ошибок при обновлении страниц.
