【问题标题】:node http-server to respond with index.html to any request节点 http-server 以 index.html 响应任何请求
【发布时间】:2017-02-06 05:53:04
【问题描述】:

我已经全局安装了http-server

我从本地端口 8080 上的 myDir 启动它。在 myDir 我有 index.html

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

如果我通过http://localhost:8080/anything 请求,我没有得到服务器的任何响应。

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

这可能吗?

提前致谢

【问题讨论】:

  • -P or --proxy Proxies all requests which can't be resolved locally to the given url. e.g.: -P http://someurl.com => 你能试试http-server -P http://localhost:8080/吗?
  • my answer 中的解决方案对您有用吗?
  • 有类似的问题,但我希望我的 dist 将作为 127.0.0.1:8080/myprofile 当我刷新这将丢失时这将如何可能。

标签: node.js httpserver


【解决方案1】:

是的,使用 -P/--proxy 选项:

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

请注意,任何错误(包括 404)都会重定向到您的索引,而不仅仅是缺少路径。

【讨论】:

  • 不幸的是,当我按照您的建议进行操作时,我(在浏览器上)收到以下消息 This site can’t be reached 和“localhost 拒绝连接”。和“ERR_CONNECTION_REFUSED”。在服务器上,我看到以服务器本身抛出错误Error: socket hang up 结束的请求流
  • 我不知道http-server,但由于任何错误都会被重定向到索引,我假设你陷入了一个循环,直到客户端放弃。我个人会像 @rsp 那样做,用 express 编写你自己的小服务器,它既简单又快速。
  • 是的。访问http://localhost:8080/anything 将重定向到http://localhost:8080/anything 等等。 --proxy 选项将主机名和端口之后的部分附加到给定的代理主机/端口。
  • 这是最终为我服务于 Angular 应用程序的本地生产构建的方法:http-server -p 8080 --proxy "localhost:8080?" ./dist
【解决方案2】:

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

'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

它比使用现成的解决方案更复杂(尽管如您所见,也没有那么复杂),但您可以更灵活地选择它的行为方式。添加日志记录等也很容易。

【讨论】:

  • 请解释为什么会这样? “但请记住,如果每个路径都返回 index.html,那么在 index.html 中,您不能引用图像、样式表或客户端 JavaScript 文件之类的任何内容。不仅使用上面显示的代码,而且使用任何发送相同响应的解决方案(index.html) 到每个请求。”
【解决方案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 一样简单。

【讨论】:

    【解决方案4】:

    为了实现您的要求,我建议您使用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 似乎也是一个不错的选择

    【讨论】:

    • 这很有用,特别是对于那些试图部署需要重定向到 index.html 的 Angular 应用程序的人
    • 使用服务:serve . -l 8080 -s
    【解决方案5】:

    战争结束后,但无论如何。 对于 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
    

    【讨论】:

      【解决方案6】:

      按照文档中的说明使用。

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

      注意代理 URL 末尾的 ?

      【讨论】:

      • 这个人做到了!这个? 很重要。
      • 从我这里重定向 /foo 但中断 /foo/ 和 /foo/bar
      猜你喜欢
      • 2020-04-24
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      • 2021-08-28
      • 2020-11-17
      • 2023-03-04
      相关资源
      最近更新 更多