【问题标题】:HAPI JS Node js creating https serverHAPI JS Node js 创建 https 服务器
【发布时间】:2015-03-01 08:24:47
【问题描述】:

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

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

【问题讨论】:

  • 您可以将所有请求从http重定向到https。
  • var http = require('http'), https = require('https'), express = require('express'), app = express(); http.createServer(app).listen(80); https.createServer({ ... }, app).listen(443);我在想这样的事情?我们不能这样做吗?
  • 不,我是在建议您为什么不将所有 http 请求重定向到 https。见github.com/bendrucker/hapi-require-https
  • 嘿,Codelion,你知道任何电子书(免费/收费),用于学习 hapi js,我想了解更多关于 hapi 的信息,我已经搜索过文档,但如果我有食谱或其他东西可能会然后我了解更多..
  • 我不知道有任何此类书籍,但您可以尝试以下我认为有帮助的教程 - github.com/nelsonic/learn-hapi

标签: node.js hapijs


【解决方案1】:

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

【讨论】:

  • 我用正确的域名尝试了同样的代码,但得到了 ENOENT 错误。由于权限或其他原因,您是否遇到过任何问题?
  • 1024以下的端口有特权,需要root权限。
  • 这是否意味着您需要使用 root 运行您的节点应用程序?似乎是个坏主意。
【解决方案2】:

您可以将所有 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了解更多详情。

【讨论】:

    【解决方案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 可能是一个好主意。

    【讨论】:

    • 关于你最后一句话:难道你不希望hapi服务器和nginx代理服务器之间也有安全连接吗?
    • server.connection - 现在不可用。使用多个服务器实例
    • 很高兴看到 5 年前的答案仍然受到喜爱:) 很可能问题和答案都已经过时了。
    【解决方案4】:

    访问链接: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);
    });
    

    对于hapi新版本

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

        还没试过。

        【讨论】:

          【解决方案7】:

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

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

          你得到:

          TypeError: server.connection is not a function
          

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

          【讨论】:

            猜你喜欢
            • 2014-07-04
            • 1970-01-01
            • 2013-09-05
            • 1970-01-01
            • 2019-02-01
            • 2021-12-13
            • 1970-01-01
            • 2015-11-04
            • 1970-01-01
            相关资源
            最近更新 更多