13

如何创建一个hapi httphttps服务器,使用相同的路由同时监听 80 和 443?

(我需要一个服务器,它应该使用完全相同的 API 在 http 和 https 上运行)

4

7 回答 7

24

直接在应用程序上处理 https 请求可能并不常见,但 Hapi.js 可以在同一个 API 中同时处理 http 和 https。

var Hapi = require('hapi');
var server = new Hapi.Server();

var fs = require('fs');

var tls = {
  key: fs.readFileSync('/etc/letsencrypt/live/example.com/privkey.pem'),
  cert: fs.readFileSync('/etc/letsencrypt/live/example.com/cert.pem')
};

server.connection({address: '0.0.0.0', port: 443, tls: tls });
server.connection({address: '0.0.0.0', port: 80 });

server.route({
    method: 'GET',
    path: '/',
    handler: function (request, reply) {
        reply('Hello, world!');
    }
});

server.start(function () {
    console.log('Server running');
});
于 2015-12-04T17:48:13.410 回答
7

您可以将所有 http 请求重定向到 https:

if (request.headers['x-forwarded-proto'] === 'http') {
  return reply()
    .redirect('https://' + request.headers.host + request.url.path)
    .code(301);
}

查看https://github.com/bendrucker/hapi-require-https了解更多详情。

于 2015-01-03T04:53:31.950 回答
3

@codelion 给出了一个很好的答案,但是如果您仍然想监听多个端口,您可以传递多个配置进行连接。

var server = new Hapi.Server();
server.connection({ port: 80, /*other opts here */});
server.connection({ port: 8080, /*other opts, incl. ssh */  });

但要再次注意,最好开始贬低 http 连接。谷歌和其他公司很快就会开始将它们标记为不安全。此外,使用 nginx 或其他东西而不是在节点应用程序本身上实际处理 SSL 可能是一个好主意。

于 2015-01-04T08:01:01.040 回答
1

访问链接:http ://cronj.com/blog/hapi-mongoose

这是一个可以帮助您解决此问题的示例项目。

对于 8.x 之前的 hapi 版本

var server = Hapi.createServer(host, port, {
    cors: true
});

server.start(function() {
    console.log('Server started ', server.info.uri);
});

对于hapi新版本

var Hapi = require('hapi');

var server = new Hapi.Server();
server.connection({ port: app.config.server.port });
于 2015-02-22T20:33:23.307 回答
0

您还可以使用local-ssl-proxy npm 包将本地 HTTPS 代理到 HTTP。仅用于本地开发。

于 2016-05-09T03:08:50.427 回答
0

我一直在寻找这样的东西,发现https://github.com/DylanPiercey/auto-sni有一个 Express、Koa、Hapi 的示例用法(未经测试)

它基本上基于 letencrypt 证书并使用自定义侦听器加载 hapi 服务器。

还没试过。

于 2017-12-02T08:48:33.847 回答
0

作为对所选答案的回复:这不再起作用,在版本 17 中删除:

https://github.com/hapijs/hapi/issues/3572

你得到 :

TypeError: server.connection is not a function

解决方法是使用代理或创建 2 个Hapi.Server()

于 2019-03-22T09:48:29.937 回答