如何创建一个hapi http
和https
服务器,使用相同的路由同时监听 80 和 443?
(我需要一个服务器,它应该使用完全相同的 API 在 http 和 https 上运行)
直接在应用程序上处理 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');
});
您可以将所有 http 请求重定向到 https:
if (request.headers['x-forwarded-proto'] === 'http') {
return reply()
.redirect('https://' + request.headers.host + request.url.path)
.code(301);
}
@codelion 给出了一个很好的答案,但是如果您仍然想监听多个端口,您可以传递多个配置进行连接。
var server = new Hapi.Server();
server.connection({ port: 80, /*other opts here */});
server.connection({ port: 8080, /*other opts, incl. ssh */ });
但要再次注意,最好开始贬低 http 连接。谷歌和其他公司很快就会开始将它们标记为不安全。此外,使用 nginx 或其他东西而不是在节点应用程序本身上实际处理 SSL 可能是一个好主意。
访问链接: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 });
您还可以使用local-ssl-proxy npm 包将本地 HTTPS 代理到 HTTP。仅用于本地开发。
我一直在寻找这样的东西,发现https://github.com/DylanPiercey/auto-sni有一个 Express、Koa、Hapi 的示例用法(未经测试)
它基本上基于 letencrypt 证书并使用自定义侦听器加载 hapi 服务器。
还没试过。
作为对所选答案的回复:这不再起作用,在版本 17 中删除:
https://github.com/hapijs/hapi/issues/3572
你得到 :
TypeError: server.connection is not a function
解决方法是使用代理或创建 2 个Hapi.Server()