2014-09-03 6 views
6

anderen SO question Folgen, haben die neueste I versucht (siehe ligatures.net):Express-JS 4.0-Anwendung mit https auf Openshift Erstellen, einschließlich http Umleitung

self.ipaddress = process.env.OPENSHIFT_NODEJS_IP; 
self.port  = process.env.OPENSHIFT_NODEJS_PORT || 443; 

if (typeof self.ipaddress === "undefined") { 
    self.ipaddress = "127.0.0.1"; 
}; 

... 
self.app = express(); // 4.8.7 

... 
// Trusting Openshift proxy 
self.app.enable('trust proxy'); 

// Http -> Https redirection middleware 
self.app.use(function (req, res, next) { 

    if (!req.secure()) { 
     var tmp = 'https://' + process.env["DOMAIN_NAME"] + req.originalUrl; 
     console.log("Redirect to: " + tmp); 
     res.redirect(tmp); 
    } else { 
     next(); 
    }    

}); 

... 

// Creating a http server 
https.createServer(self.app).listen(self.port, self.ipaddress, 
    function(err) { 
     if (err) { 
      console.log("Node server error: " + err.toString()); 
     } else { 
      console.log('%s: Node server started on %s:%d ...', 
       Date(Date.now()), self.ipaddress, self.port); 
     } 
}); 

In den Openshift-Protokolle, die ich erhalten:

Eigenschaft 'sicheren' von Objekt # ist keine Funktion

Dies ist die Zeile: if (!req.secure()) {

Die Zertifikate werden in die Konsole geladen. Die Anwendung startet erfolgreich an Port 8080.

Warum erhalte ich diese Nachricht und wie soll ich eine gesicherte Express 4.0 https-Anwendung in OpenShift erstellen? Hat jemand Betriebscode zum Teilen? Vielen Dank!

SERVER no redirect: http://undefined/ 
Protocol: http 
Host : 
Url :/

und meine Anwendung immer noch nicht:

// Http -> Https redirection middleware 
self.app.use(function (req, res, next) { 

    if (req.headers['x-forwarded-proto'] === 'http') { 

     var tmp = 'https://' + req.headers.host + req.originalUrl; 
     console.log("SERVER redirect to: " + tmp); 
     res.redirect(tmp); 

    } else { 

     var pt = req.protocol || ""; 
     var ho = req.headers.host || ""; 
     var ur = req.originalUrl || ""; 

     console.log("\nProtocol: " + pt 
        + "\nHost : " + ho 
        + "\nUrl : " + ur); 

     var tmp = req.protocol + '://' + req.headers.host + req.originalUrl; 
     console.log("SERVER no redirect: " + tmp); 
     next(); 

    } 

ich von der Konsole zu sehen, ein paar der folgenden Möglichkeiten:

UPDATE

Ich habe die Umleitung wie folgt aktualisiert Arbeit. Es sieht für mich wie ein Fehler aus.

Ich habe ein Problem, geöffnet: https://bugzilla.redhat.com/show_bug.cgi?id=1138137

Ich bin auch hinter Cloudflare, die ein Teil des Problems sein kann.

Antwort

4

Es gab zwei Probleme:

i) Wenn Sie den kostenlosen Plan von Cloudflare verwenden, werden die SSL-Anfragen nicht weitergeleitet. Wenn Sie Cloudflare deaktivieren (während Sie beispielsweise ihren DNS beibehalten), werden die SSL-Anfragen an Openshift weitergeleitet.

ii) Aus unbekannten Gründen, einige leeren Anfragen erreichen meine Anwendung auf Openshift beim Starten und beim Surfen Seiten später zu:

req.path:/
req.protocol: http 
req.originalUrl:/
req.secure: false 

Der Code in Openshift des erwähnten KB article kann nicht gut funktionieren, wie es ist, für zwei Gründe. Erstens berücksichtigt req.path Abfrageparameter nicht. Man sollte stattdessen req.originalUrl in Express 4.0 verwenden.

Zweite anstelle von self.app.get(r, redirectSec, self.routes[r]);, sollte man die Middleware mit self.app.use in Express 4 hinzufügen.0:

Meine HTTP auf HTTPS-Code Weiterleitung ist jetzt:

// Trusting Openshift proxy 
self.app.enable('trust proxy'); 

// Http -> Https redirection middleware 
self.app.use(function (req, res, next) { 

     if (req.headers['x-forwarded-proto'] === 'http') { 

      var tmp = 'https://' + req.headers.host + req.originalUrl; 
      res.redirect(tmp); 

     } else { 

      return next(); 

     } 

    } 

}); 

Alles scheint jetzt zu funktionieren.

2

Versuchen Sie dieses Stück Code aus der help.openshift.com Webseite:

function redirectSec(req, res, next) { 
     if (req.headers['x-forwarded-proto'] == 'http') { 
      res.redirect('https://' + req.headers.host + req.path); 
     } else { 
      return next(); 
     } 
    } 

die in diesem KB-Artikel zu finden ist: https://help.openshift.com/hc/en-us/articles/202398810-How-to-redirect-traffic-to-HTTPS-

+0

Dieses bisschen Code funktioniert nicht. Siehe Updates in meiner Frage. – JVerstry

+0

hast du 'ohne' cloudflare versucht, um zu sehen, ob das das Problem ist? –

+0

Cloudflare war Teil des Problems, aber der KB-Code, den Sie erwähnen, benötigt ein Update sicher. Siehe meine Antwort. – JVerstry