Express的多个证书/虚拟主机
在Cody-CMS中使用Express +虚拟主机,现在我已经使用了多个主机的nodejs。 现在我想包括虚拟HTTPS服务器。
SNICallback被调用,但它结束在那里…我的Express应用程序“exp”永远不会被调用(即使我使用一个简单的函数在注释中将其replace为createServer)。 我得到“请求:site1.com”(或site2.com),但没有任何返回给浏览器。
对于http服务器来说,它是完美的。
任何帮助是受欢迎的。
"use strict"; var express = require("express"); var vhost = require("vhost"); var fs = require("fs"); var app1 = express(); app1.all("/", function(req, res) { res.send('Hello World, site #1'); }); var app2 = express(); app2.all("/", function(req, res) { res.send('Hello World, site #2'); }); ////////////////// // certificates // ////////////////// var crypto = require('crypto'); const site1 = { app: app1, context: crypto.createCredentials({ key: fs.readFileSync('ws.key').toString(), cert: fs.readFileSync('ws.crt').toString() }).context }; const site2 = { app: app2, context: crypto.createCredentials({ key: fs.readFileSync('ws2.key').toString(), cert: fs.readFileSync('ws2.crt').toString() }).context }; var sites = { "www.site1.com": site1, "site1.com": site1, "www.site2.com": site2, "site2.com": site2 }; // put (www.)site1/2.com in /etc/hosts to 127.0.0.1 ////////// // http // ////////// var exp = express(); for (let s in sites) { console.log("http -> " + s); exp.use(vhost(s, sites[s].app)); } exp.listen(80, function () { console.log("Listening https on port: 80") }); /////////// // https // /////////// var secureOpts = { SNICallback: function (domain) { console.log('request for: ', domain); return sites[domain].context; }, key: fs.readFileSync('ws.key').toString(), cert: fs.readFileSync('ws.crt').toString() }; var https = require('https'); var httpsServer = https.createServer(secureOpts, exp); // var httpsServer = https.createServer(secureOpts, function(req, resp) { resp.send("hello"); }); httpsServer.listen(443, function () { console.log("Listening https on port: 443") });
SNICallback
有第二个参数: cb
。 cb
的签名是(error, context)
。 所以你的secureOpts
应该是这样的:
var secureOpts = { SNICallback: function(domain, cb) { console.log('request for: ', domain); cb(null, sites[domain].context); }, key: fs.readFileSync('ws.key').toString(), cert: fs.readFileSync('ws.crt').toString() };
在mscdex的帮助下,我做了这个例子。 http://coppieters.blogspot.be/2016/04/nodejs-virtual-hosts-websitesapps-on.html