HAPI JS节点js创建https服务器

时间:2015-01-03 04:27:37

标签: node.js hapijs

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

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

7 个答案:

答案 0 :(得分:20)

直接在应用程序上处理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');
});

答案 1 :(得分: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了解详情。

答案 2 :(得分: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可能是个好主意,而不是在节点应用程序本身上。

答案 3 :(得分:1)

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

以下a sample project可以帮助您解决此问题。

对于早于8.x的hapi版本

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

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

for hapi new version

var Hapi = require('hapi');

var server = new Hapi.Server();
server.connection({ port: app.config.server.port });

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我正在寻找类似的东西,并找到了https://github.com/DylanPiercey/auto-sni,其中包含Express,Koa,Hapi(未经测试)的示例用法

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

尚未尝试过。

答案 6 :(得分:0)

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

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

您得到了:

TypeError: server.connection is not a function

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