Узел 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
Другие вопросы по тегам