节点http-server用index.html响应任何请求

时间:2016-09-28 10:05:25

标签: node.js httpserver

我在全球范围内安装了http-server

我从localhost端口8080上的 myDir 启动它。在 myDir 中,我有index.html

如果我(从浏览器)请求http://localhost:8080/我得到index.html,这没关系。

如果我请求http://localhost:8080/anything我没有收到服务器的任何回复。

相反,我想要的是我的服务器总是使用index.html响应任何到达端口8080上的localhost的http请求。

这可能。

提前致谢

6 个答案:

答案 0 :(得分:5)

使用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一样简单。

答案 1 :(得分:5)

要实现您的要求,我建议您live-server而不是http-server。

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

live-server也提供热重载,但这不是你的要求之一

编辑:live-server并非设计用于生产。例如没有gzip压缩

编辑2:http-server的维护者清楚地说in this comment从来没有,http-server会考虑SPA用例

编辑3:serve似乎也是一个不错的选择

答案 2 :(得分:3)

是的,有href / -P选项:

--proxy

请注意,包含404的任何错误将重定向到您的索引,而不仅仅是缺少路径。

答案 3 :(得分:3)

有时对于像这样的特定情况,编写自己的服务器很容易:

'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

比使用现成的解决方案更复杂(但是,正如您所看到的那样,也不是那么复杂)但是您可以更灵活地确定它的行为方式。添加日志记录等也很容易。

答案 4 :(得分:3)

按照文档中的说明使用。

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

请注意代理URL末尾的?

答案 5 :(得分:0)

战争结束后有一点,但无论如何。 对于有角度的应用程序,我建议添加到您的package.json中:

"serve-prod": "cp dist/app-name/index.html dist/app-name/404.html && http-server dist/app-name"

然后拨打电话

npm run serve-prod