web-dev-qa-db-fra.com

nœud http-server pour répondre avec index.html à toute demande

J'ai installé http-server globalement.

Je le lance depuis myDir sur le port localhost 8080. Dans myDir j'ai index.html.

Si je demande (depuis le navigateur) http://localhost:8080/ J'obtiens index.html, ce qui est OK.

Si je demande cependant http://localhost:8080/anything Je ne reçois aucune réponse du serveur.

Ce que je voudrais, au contraire, c'est que mon serveur réponde toujours avec index.html à toute requête http atteignant localhost sur le port 8080.

Est-ce possible.

Merci d'avance

13
Picci

Pour réaliser ce que vous demandez, je vous recommande live-server au lieu de http-server.

live-server --port=8080 --entry-file=./index.html

live-server fournit également un rechargement à chaud, mais ce n'était pas une de vos demandes

Edit: live-server n'est pas conçu pour être utilisé en production. Pas de compression gzip par exemple

Edit 2: Le mainteneur du serveur http a clairement dit dans ce commentaire que jamais, le serveur http ne considérera les cas d'utilisation du SPA

Edit 3: serve semble aussi être une bonne option

6
Gabriel

Exemple simple et direct utilisant 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);

Cette implémentation répondra toujours par index.html si le fichier demandé n'est pas trouvé, et c'est presque aussi simple que d'utiliser http-server, qui n'a pas cette option.

5
Jaime Gómez

Oui, avec le -P/--proxy option:

http-server -P http://localhost:8080/

Notez que any error, 404 included, redirigera vers votre index, pas seulement le chemin manquant.

4
DrakaSAN

Parfois, pour des cas spécifiques comme celui-ci, il est assez facile d'écrire votre propre serveur:

'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}/`));

Mais gardez à l'esprit que si chaque chemin retourne index.html puis dans le index.html vous ne pouvez rien référencer comme des images, des feuilles de style ou des fichiers JavaScript côté client. Non seulement avec le code ci-dessus, mais avec toute solution qui envoie la même réponse (index.html) à chaque demande.

Vous devrez peut-être faire quelques exceptions et ce n'est pas difficile avec 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}/`));

Gardez juste à l'esprit que les exceptions doivent aller en haut car la première route correspondante sera utilisée pour une demande donnée.

Bien sûr, vous devez enregistrer ce code, par exemple à app.js, installez Express:

npm install express

et commencez avec:

node app.js

C'est plus compliqué que d'utiliser une solution prête à l'emploi (bien que, comme vous pouvez le voir, ce ne soit pas compliqué non plus), mais vous avez beaucoup plus de flexibilité dans la façon dont vous souhaitez qu'elle se comporte exactement. Il est également facile d'ajouter la journalisation, etc.

3
rsp