DevOps

Развертывание Vite React SPA на Plesk: фикс 404 и Node.js

Пошаговое руководство по деплою SPA на React 19 + Vite на Plesk без Node.js. Решение ошибок 'Application Startup File' и 404 на маршрутах react-router-dom при обновлении. Настройка .htaccess, статика dist и альтернатива с Express.

8 ответов 2 просмотра

Как развернуть 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.

Проблемы:

  1. Node.js расширение Plesk требует ‘Application Startup File’, но в package.json только скрипты vite (dev, build, preview).
  2. При указании 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.

Вопросы:

  1. Нужно ли включать Node.js поддержку в Plesk для Vite SPA или достаточно обслуживать dist как статические файлы?
  2. Если статика, как настроить history fallback для react-router-dom (чтобы избежать 404 на рефреше) с помощью .htaccess или Nginx-директив в Plesk?
  3. Или требуется создать простой 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 — это быстрый инструмент для создания современных 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 без допов.

Шаги минимальны:

  1. Соберите проект: npm run build.
  2. Через File Manager в plesk панель загрузите содержимое dist (не всю папку!) в httpdocs (или subdomain root).
  3. В 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 в корне проекта:

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 проект готов.

  1. Локально: npm run build. Проверьте dist/index.html.
  2. Plesk File Manager: очистите httpdocs, залейте файлы из dist.
  3. Отключите Node.js: Hosting Parameters → Node.js → Off (игнор ‘Startup File’).
  4. .htaccess: создайте как выше.
  5. Тестируйте: https://yourdomain.com/contact — F5 без 404.
  6. 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 молниеносным. Вопросов нет?


Источники

  1. 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
  2. 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/
  3. 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
  4. How to Deploy React App — Простой деплой dist в Plesk без Node.js: https://talk.plesk.com/threads/how-to-deploy-react-app.374950/
  5. How to Deploy a React.js App Using Plesk — Пошаговая инструкция с rewrite правилами: https://websavers.ca/how-to-deploy-a-react-js-app-using-plesk
  6. Deploying a React.js Application — Базовое размещение статики на Plesk: https://cp.adaptivewebhosting.com/knowledgebase/92/Deploying-a-React.js-Application-.html
  7. 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. Тестируйте, оптимизируйте — и ваш проект полетит в прод. Удачи с деплоем!

S

SPA на Vite + React с react-router-dom требует обслуживания всех маршрутов через index.html. Создайте файл _redirects в папке /public (без расширения) с правилом /* /index.html 200 — это обеспечит history fallback для клиентской маршрутизации. Загружайте содержимое dist напрямую в document root Plesk без активации Node.js расширения, так как сервер не нужен для статических файлов. Это решает проблему 404 на маршрутах вроде /contact при обновлении страницы.

P

Для 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 автоматически обслуживает статику.

Ivan Zuev / Геймер и контент-менеджер

Чтобы исправить 404 ошибки react-router-dom на Plesk, добавьте .htaccess в корень dist:

apache
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.html [QSA,L]

Это перенаправит несуществующие маршруты (Vite React router) на index.html, отключив MultiViews для корректной клиентской маршрутизации.

A

Развертывание Vite build React на Plesk: поместите содержимое dist прямо в document root (httpdocs), без вложенной папки. React SPA — это статика (HTML/JS/CSS), Plesk обслуживает файлы автоматически. Для react-router-dom настройте fallback после деплоя, используйте отдельный root для поддоменов.

J

Выполните npm run build для Vite React, загрузите build/dist в httpdocs Plesk через File Manager. В Hosting Settings укажите document root на index.html. Для react-router добавьте .htaccess:

apache
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]

Это фиксит 404 на маршрутах; Node.js используйте только для backend.

После vite build react папка dist содержит статику. Загрузите её в document root Plesk — никаких дополнительных настроек для базового SPA не требуется, панель обслуживает файлы автоматически. Для react-router-dom настройте rewrite-правила отдельно, чтобы избежать 404 на клиентских маршрутах.

V

Без Node.js: используйте .htaccess в build с RewriteCond !-f !-d и RewriteRule ^ index.html [QSA,L]. С Node.js: создайте server.js на Expressapp.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.

Авторы
S
Разработчик
P
Новичок Plesk
A
Сотрудник службы поддержки
Ivan Zuev / Геймер и контент-менеджер
Геймер и контент-менеджер
A
Новичок Plesk
J
Управляющий партнер
V
Разработчик
T
Разработчик
A
Разработчик
Источники
Хостинг-провайдер
Проверено модерацией
Модерация
Развертывание Vite React SPA на Plesk: фикс 404 и Node.js