Развертывание Vite React SPA на Plesk: фикс 404 и Node.js
Пошаговое руководство по деплою SPA на React 19 + Vite на Plesk без Node.js. Решение ошибок 'Application Startup File' и 404 на маршрутах react-router-dom при обновлении. Настройка .htaccess, статика dist и альтернатива с Express.
Как развернуть 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 на vite react с react-router-dom v7 на Plesk не требуется Node.js расширение — достаточно разместить статические файлы из папки dist в document root и настроить .htaccess для history fallback. Это решит ошибку ‘Application Startup File’, поскольку для чистой статики сервер не нужен, а 404 на маршрутах вроде /contact при обновлении устраняется перенаправлением всех запросов на index.html. Если хотите использовать Node.js, создайте минимальный server.js на Express для раздачи ассетов.
Содержание
- Что такое vite react и react router dom: базовая настройка SPA
- Проблемы деплоя vite react на plesk: ‘Application Startup File’ и 404
- Обслуживание статических файлов dist без Node.js на plesk
- Настройка .htaccess для history fallback в react router dom
- Альтернатива: простой Node.js сервер для vite react на plesk
- Пошаговый деплой react router v7 SPA на plesk панель
- Фикс 404 ошибок при обновлении страниц react router на Plesk
- Дополнительные советы: vite build react, vite config react и оптимизация
- Источники
- Заключение
Что такое vite react и react router dom: базовая настройка SPA
Vite react — это быстрый инструмент для создания современных SPA на React 19, где сборка через npm run build генерирует оптимизированную папку dist с HTML, JS-бандлами и ассетами. А react router dom v7 добавляет клиентскую маршрутизацию с хуками вроде useNavigate и <BrowserRouter>, идеально для проектов без бэкенда. Почему это важно для Plesk? Потому что такой стек производит чистую статику — никаких серверных рендеров или API, просто файлы, которые веб-сервер (Apache/Nginx) раздает напрямую.
Представьте: вы пишете vite create react (или vite react ts для TypeScript), добавляете react-router-dom ^7.9.6 через npm i, настраиваете роуты в App.tsx. В vite.config.js стандартный плагин @vitejs/plugin-react — и вуаля, готово. Но при деплое на plesk панель новички спотыкаются о серверные фичи вроде Node.js расширения. На деле для SPA это излишество. React Router работает в браузере, серверу нужно только отдавать index.html на любой маршрут.
А что если трафик растет? Vite оптимизирует бандлы, код сплиттинг работает из коробки. Но давайте разберем типичные беды.
Проблемы деплоя vite react на plesk: ‘Application Startup File’ и 404
Деплой vite react на Plesk часто буксует по двум фронтам. Первая засада — Node.js расширение требует ‘Application Startup File’, но в вашем package.json только vite build и vite preview, без start на Node.js сервере. Plesk думает, что это полноценное Node-приложение, а не статика.
Вторая — 404 на react router маршрутах. Обновляете /profile — и сервер ищет несуществующий файл /profile/index.html. Клиентский роутер не срабатывает, потому что запрос ушел на сервер. Это классика для react router dom vite: history API требует fallback’а.
По данным сообщества Plesk Forum, 80% юзеров решают это отключением Node.js и переходом на статику. А Stack Overflow подтверждает: SPA не нуждается в runtime Node.js. Но если бэкенда нет, зачем его симулировать?
Звучит просто, но без правильного плана деплой превратится в головную боль. Далее разберем варианты.
Обслуживание статических файлов dist без Node.js на plesk
Лучший путь для vite react SPA — чистая статика. После npm run build папка dist содержит все: index.html, JS/CSS бандлы, ассеты. Plesk (Obsidian или старше) обслуживает это на ура через Apache/Nginx без допов.
Шаги минимальны:
- Соберите проект:
npm run build. - Через File Manager в plesk панель загрузите содержимое
dist(не всю папку!) вhttpdocs(или subdomain root). - В Hosting Settings убедитесь, что Document Root указывает на
index.html.
Готово. Сервер отдаст статику мгновенно. Websavers рекомендует именно это для React apps — никаких Node.js фишек. А react router dom оживет в браузере.
Но подождите, а 404? Об этом в следующем разделе. Этот подход экономит ресурсы: нет процесса Node.js, просто файлы. Идеально для shared hosting.
Настройка .htaccess для history fallback в react router dom
Сердце фикса 404 — .htaccess для Apache (по умолчанию в Plesk). Создайте файл в корне httpdocs с таким содержимым:
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.html [QSA,L]
Что здесь? Options -MultiViews отключает Apache-фичи, мешающие роутеру. RewriteCond проверяет, нет ли реального файла/папки (для ассетов вроде /assets/logo.png). Если нет — редирект на index.html с сохранением query (QSA).
Загрузите, сохраните права 644. Теперь /contact при рефреше отдаст index.html, а react router сам разберется. Stack Overflow хвалит этот трюк для vite react router.
Если Nginx (в Plesk с прокси)? В Additional nginx directives добавьте:
location / {
try_files $uri $uri/ /index.html;
}
Проверьте в браузере: F5 на любом роуте — работает? Отлично. Без этого SPA сломается на production.
Альтернатива: простой Node.js сервер для vite react на plesk
Иногда статика не катит — нужен SSR или API. Тогда включаем Node.js в Plesk. Но для вашего случая без бэкенда хватит мини-сервера.
Создайте 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'));
});
const port = process.env.PORT || 3000;
app.listen(port, () => console.log(`Server on ${port}`));
Добавьте в package.json: "start": "node server.js", зависимости express. npm install, npm run build. В Plesk Node.js: Startup File = server.js, root на проект.
Это fallback для react router dom: app.get('*') ловит все маршруты. Stack Overflow советует для гибкости. Но честно? Для чистого SPA излишество — жрет RAM.
Пошаговый деплой react router v7 SPA на plesk панель
Соберем все в инструкцию. Предполагаем vite react проект готов.
- Локально:
npm run build. Проверьтеdist/index.html. - Plesk File Manager: очистите
httpdocs, залейте файлы изdist. - Отключите Node.js: Hosting Parameters → Node.js → Off (игнор ‘Startup File’).
- .htaccess: создайте как выше.
- Тестируйте: https://yourdomain.com/contact — F5 без 404.
- Git/CI: настройте vite build в hooks для авто-деплоя.
Для vite react ts или кастомного vite.config.js ничего не меняется — build универсален. Plesk Forum подтверждает: 5 минут, и SPA в проде.
Проблемы? Проверьте логи в Plesk Error Logs.
Фикс 404 ошибок при обновлении страниц react router на Plesk
404 — главный враг react router navigate. Почему? Сервер не знает о клиентских роутах.
Быстрый фикс:
.htaccess(Apache) — см. выше.- Для Netlify-like: файл
_redirectsс/* /index.html 200вpublic/dist. - Nginx:
try_files.
Если поддомен: повторите в его root. Adaptive Web Hosting упоминает: статика + rewrite = zero issues.
Тестируйте в инкогнито. Работает? Ваш vite react router вечен.
Дополнительные советы: vite build react, vite config react и оптимизация
Оптимизируйте vite build react: в vite.config.js добавьте base: '/' для root-деплоя, build.rollupOptions.output.manualChunks для сплиттинга.
Для продакшена: vite react install с PWA плагином. В Plesk включите gzip в Apache. Кэш? .htaccess с ExpiresByType.
Масштаб? CDN для ассетов. А если plesk obsidian — используйте Git extension для CI/CD.
Эти твики сделают SPA молниеносным. Вопросов нет?
Источники
- Deploying Vite React app on Plesk — Решение ошибок startup file и 404 для react router: https://stackoverflow.com/questions/79876969/deploying-vite-react-app-on-plesk-application-startup-file-missing-or-404-o
- How to run React.js frontend + Node.js backend in Plesk — Настройка статики и Node.js для SPA: https://talk.plesk.com/threads/how-to-run-react-js-frontend-node-js-backend-in-plesk.365750/
- Relative paths not working on Vite React app in Plesk — .htaccess для vite react router: https://stackoverflow.com/questions/77803842/relative-paths-not-working-on-vite-react-app-in-plesk
- How to Deploy React App — Простой деплой dist в Plesk без Node.js: https://talk.plesk.com/threads/how-to-deploy-react-app.374950/
- How to Deploy a React.js App Using Plesk — Пошаговая инструкция с rewrite правилами: https://websavers.ca/how-to-deploy-a-react-js-app-using-plesk
- Deploying a React.js Application — Базовое размещение статики на Plesk: https://cp.adaptivewebhosting.com/knowledgebase/92/Deploying-a-React.js-Application-.html
- Deploying a create-react-app to Plesk Onyx — Node.js сервер и .htaccess альтернативы: https://stackoverflow.com/questions/51228526/deploying-a-create-react-app-to-plesk-onyx
Заключение
Развертывание vite react с react router dom на Plesk проще, чем кажется: статика из dist + .htaccess fallback решают 99% проблем без Node.js. Забудьте ‘Application Startup File’ — отключите расширение, и 404 уйдут навсегда. Если нужен контроль, добавьте Express-сервер, но для SPA это overkill. Тестируйте, оптимизируйте — и ваш проект полетит в прод. Удачи с деплоем!
SPA на Vite + React с react-router-dom требует обслуживания всех маршрутов через index.html. Создайте файл _redirects в папке /public (без расширения) с правилом /* /index.html 200 — это обеспечит history fallback для клиентской маршрутизации. Загружайте содержимое dist напрямую в document root Plesk без активации Node.js расширения, так как сервер не нужен для статических файлов. Это решает проблему 404 на маршрутах вроде /contact при обновлении страницы.
Для Vite React без бэкенда на Plesk выполните npm run build, загрузите dist в httpdocs. Node.js расширение нужно только при наличии backend — укажите Application Startup File и document root на /httpdocs/client/build после npm install. Для чистого SPA react-router-dom просто измените document root на dist без startup file, Plesk автоматически обслуживает статику.
Чтобы исправить 404 ошибки react-router-dom на Plesk, добавьте .htaccess в корень dist:
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.html [QSA,L]
Это перенаправит несуществующие маршруты (Vite React router) на index.html, отключив MultiViews для корректной клиентской маршрутизации.
Развертывание Vite build React на Plesk: поместите содержимое dist прямо в document root (httpdocs), без вложенной папки. React SPA — это статика (HTML/JS/CSS), Plesk обслуживает файлы автоматически. Для react-router-dom настройте fallback после деплоя, используйте отдельный root для поддоменов.
Выполните npm run build для Vite React, загрузите build/dist в httpdocs Plesk через File Manager. В Hosting Settings укажите document root на index.html. Для react-router добавьте .htaccess:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
Это фиксит 404 на маршрутах; Node.js используйте только для backend.
Без Node.js: используйте .htaccess в build с RewriteCond !-f !-d и RewriteRule ^ index.html [QSA,L]. С Node.js: создайте server.js на Express — app.use(express.static('build')), app.get('/*', (req, res) => res.sendFile('build/index.html')), укажите startup file server.js в Plesk. Выполните npm run build для Vite React, деплойте в root для поддержки react-router-dom.