Узел http-сервера для ответа index.html на любой запрос
Я установил http-server
во всем мире.
Я запускаю его из myDir на локальный порт 8080. В myDir у меня есть index.html
,
Если я прошу (из браузера) http://localhost:8080/
Я получаю index.html, который в порядке.
Если я прошу, хотя http://localhost:8080/anything
Я не получаю никакого ответа от сервера.
Наоборот, я хотел бы, чтобы мой сервер всегда отвечал index.html на любой http-запрос, достигающий localhost на порту 8080.
Это возможно.
заранее спасибо
8 ответов
Используйте как указано в документации.
http-server --port 8080 -P http://localhost:8080?
Обратите внимание
?
в конце URL-адреса прокси.
Чтобы достичь того, о чем вы просите, я рекомендую вам использовать live-сервер вместо http-сервера.
live-server --port=8080 --entry-file=./index.html
Live-сервер также обеспечивает горячую перезагрузку, но это не был ваш запрос
Редактировать: live-сервер не предназначен для использования в производстве. Без сжатия gzip например
Редактировать 2: Сопровождающий http-сервер четко сказал в этом комментарии, что никогда http-сервер не будет рассматривать варианты использования SPA
Редактировать 3: подача тоже кажется хорошим вариантом
Простой и понятный пример использования Express 4.x:
var express = require('express');
var app = express();
var path = __dirname + '/public';
var port = 8080;
app.use(express.static(path));
app.get('*', function(req, res) {
res.sendFile(path + '/index.html');
});
app.listen(port);
Эта реализация всегда будет отвечать index.html
если запрошенный файл не найден, и это почти так же просто, как с помощью http-server
, которой не хватает этой опции.
Да, с -P
/--proxy
опция:
http-server -P http://localhost:8080/
Обратите внимание, что любая ошибка, включая 404, будет перенаправлена на ваш индекс, а не просто на пропущенный путь.
Иногда для конкретных случаев, таких как этот, достаточно просто написать свой собственный сервер:
'use strict';
var host = '127.0.0.1', port = 3333;
var path = require('path');
var app = require('express')();
app.get('*', (req, res) => res.sendFile(path.join(__dirname, 'index.html')));
app.listen(port, () => console.log(`Listening on http://${host}:${port}/`));
Но имейте в виду, что если каждый путь возвращается index.html
затем в index.html
Вы не можете ссылаться на что-либо, например изображения, таблицы стилей или файлы JavaScript на стороне клиента. Не только с кодом, показанным выше, но и с любым решением, которое отправляет тот же ответ (index.html
) к каждому запросу.
Возможно, вам придется сделать некоторые исключения, и это не сложно с Express:
'use strict';
var host = '127.0.0.1', port = 3333;
var path = require('path');
var app = require('express')();
app.get('/x.png', (req, res) => res.sendFile(path.join(__dirname, 'x.png')));
app.get('*', (req, res) => res.sendFile(path.join(__dirname, 'index.html')));
app.listen(port, () => console.log(`Listening on http://${host}:${port}/`));
Просто имейте в виду, что исключения должны идти наверх, потому что для данного запроса будет использоваться первый соответствующий маршрут.
Конечно, вам нужно сохранить этот код, например, в app.js
, установите Express:
npm install express
и начать это с:
node app.js
Это сложнее, чем использование готового решения (хотя, как вы можете видеть, не так уж и сложно), но у вас гораздо больше гибкости в том, как именно вы хотите, чтобы оно работало. Также легко добавить ведение журнала и т. Д.
Я столкнулся с этой проблемой, пытаясь создать стройное приложение для производства. Вместо использованияhttp-server
я используюsirv
:
сначала установите егоnpm i --save-dev sirv-cli
затем добавьте этот скрипт в package.json:"start": "sirv public --single",
Удачного кодирования!
Если вы создадите проект «Vite», он справится с этим.vite preview
команда служитdist
папка в режиме одного файла (index.html).
Немного после войны, но все равно. для приложения angular я предлагаю добавить в ваш package.json:
"serve-prod": "cp dist/app-name/index.html dist/app-name/404.html && http-server dist/app-name"
Тогда позвони
npm run serve-prod