如何使用相同的路由创建 hapi http
和https
服务器,同时监听80和443?
(我需要一台服务器,它应该在http和https上使用完全相同的API运行)
答案 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);
}
答案 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()
实例