2016-07-02 10 views
0

Ich habe ein Projekt, wo ich zwei Websites mit zwei Domains hosten muss, die auf den gleichen Server (1 statische IP) mit einem EJpressJS Server zeigen. Während meiner Forschung fand ich, dass Express mit Vhosts erweitert werden kann. Aber ich konnte nicht herausfinden, wie man sie mit https benutzt. Mein Wunsch ist es, zu verschiedene Express-Objekte zu haben, so dass ich auf 'foo.com'-Anfragen über appFoo.get() und' bar.com'-Anfragen über appBar.get() oder deren POST- oder JSON-Äquivalent zugreifen kann. Ich möchte keinen Proxy in Apache, Nginx oder Knoten selbst verwenden. Und ich möchte sie beide auf Port 80/443 laufen lassen.ExpressJS Multi Domain https hosting

Antwort

0
// Includes 
var https = require('https'); 
var express = require('express'); 
var tls = require('tls'); 
var vhost = require('vhost'); 
var fs = require('fs'); 


// Express objects 
var appFoo = express(); 
var appBar = express(); 

// SSL Constants 
const siteFoo = { 
    app: appFoo, 
    context: tls.createSecureContext({ 
     key: fs.readFileSync(__dirname + '/tls/foo.com/privkey.pem').toString(), 
     cert: fs.readFileSync(__dirname + '/tls/foo.com/fullchain.pem').toString(), 
     ca: fs.readFileSync(__dirname + '/tls/foo.com/chain.pem').toString() 
    }).context 
}; 

const siteBar = { 
    app: appBar, 
    context: tls.createSecureContext({ 
     key: fs.readFileSync(__dirname + '/tls/bar.com/privkey.pem').toString(), 
     cert: fs.readFileSync(__dirname + '/tls/bar.com/fullchain.pem').toString(), 
     ca: fs.readFileSync(__dirname + '/tls/bar.com/chain.pem').toString() 
    }).context 
}; 

// Sites 
var sites = { 
    'www.foo.com': siteFoo, 
    'foo.com': siteFoo, 

    'www.bar.com': siteBar, 
    'bar.com': siteBar 
} 

// Setup vhosts 
var exp = express(); 
for (var s in sites) { 
    console.log("add app for " + s); 
    exp.use(vhost(s, sites[s].app)); 
} 

// Redirect from http port to https 
var http = require('http'); 
http.createServer(function (req, res) { 
    res.writeHead(301, { "Location": "https://" + req.headers['host'] + req.url }); 
    console.log(req.headers['host']); 
    console.log(req.url); 
    res.end(); 
}).listen(80); 

// HTTPS Server 
var secureOpts = { 
    SNICallback: function (domain, cb) { 
     if (typeof sites[domain] === "undefined") { 
      cb(new Error("domain not found"), null); 
      console.log("Error: domain not found: " + domain); 

     } else { 
      cb(null, sites[domain].context); 
     } 
    }, 
    key: fs.readFileSync(__dirname + '/tls/qarm.de/foo.com/privkey.pem').toString(), 
    cert: fs.readFileSync(__dirname + '/tls/qarm.de/foo.com/fullchain.pem').toString(), 
    ca: fs.readFileSync(__dirname + '/tls/qarm.de/foo.com/chain.pem').toString() 
}; 

var https = require('https'); 
var httpsServer = https.createServer(secureOpts, exp); 
httpsServer.listen(443, function() { 
    console.log("Listening https on port: " + + this.address().port); 
}); 

appFoo.get('/', function(req,res) { 
    res.send('Foo.com'); 
} 

appBar.get('/', function(req,res) { 
    res.send('bar.com'); 
} 

Dieser Code erstellt zwei getrennte vHost von neuen Express-Objekte initialisiert TLS, DIRECTES Anfragen an das richtige Objekt und leitet den gesamten Datenverkehr von HTTP (Port 80) auf HTTPS (443)

Verwandte Themen