Ich habe eine Anwendung auf Heroku mit Express auf Knoten mit https. Wie identifiziere ich das Protokoll, um eine Umleitung zu https mit nodejs auf heroku zu erzwingen?
Meine App ist nur ein einfacher http-Server. Sie erkennt (noch) nicht, dass Heroku https-Anfragen sendet:
/* Heroku provides the port they want you on in this environment variable (hint: it's not 80) */
app.listen(process.env.PORT || 3000);
app.get('*',function(req,res,next){ if(req.headers['x-forwarded-proto']!='https') res.redirect('https://mypreferreddomain.com'+req.url) else next() })
Antworten:
Ab heute, dem 10. Oktober 2014 , mit Heroku Cedar Stack und ExpressJS ~ 3.4.4 , ist hier ein funktionierender Satz von Code.
Die Hauptsache, an die wir uns erinnern sollten, ist, dass wir Heroku einsetzen. Die SSL-Beendigung erfolgt am Load Balancer, bevor der verschlüsselte Datenverkehr Ihre Knoten-App erreicht. Es ist möglich zu testen, ob https verwendet wurde, um die Anforderung mit req.headers ['x-forwarded-proto'] === 'https' zu stellen .
Wir müssen uns nicht darum kümmern, lokale SSL-Zertifikate in der App usw. zu haben, wie Sie es vielleicht tun, wenn Sie in anderen Umgebungen hosten. Sie sollten jedoch zuerst ein SSL-Add-On über Heroku-Add-Ons anwenden lassen, wenn Sie Ihr eigenes Zertifikat, Ihre eigenen Subdomains usw. verwenden.
Fügen Sie dann einfach Folgendes hinzu, um die Umleitung von etwas anderem als HTTPS zu HTTPS durchzuführen. Dies kommt der oben akzeptierten Antwort sehr nahe, aber:
Code:
Hinweis für Benutzer von SailsJS (0.10.x). Sie können einfach eine Richtlinie (erzwingenSsl.js) in API / Richtlinien erstellen:
Verweisen Sie dann zusammen mit anderen Richtlinien auf config / Policies.js, z.
quelle
res.redirect
dies standardmäßig eine 302-Umleitung ist (zumindest in Express 4.x). Aus SEO- und Caching-Gründen möchten Sie wahrscheinlich stattdessen eine 301-Weiterleitung. Ersetzen Sie die entsprechende Zeile durchreturn res.redirect(301, ['https://', req.get('Host'), req.url].join(''));
Express 4.x
Entfernen Sie in dieapp.configure
Linie und verwenden Sie einfach den inneren Trank.app.configure
ist Legacy-Code und nicht mehr in Express enthalten.Die Antwort ist, den Header von 'x-forwarded-proto' zu verwenden, den Heroku weiterleitet, während es sein Proxy-Dingamabob tut. (Randnotiz: Sie übergeben auch einige andere x-Variablen, die nützlich sein können, überprüfen Sie sie ).
Mein Code:
Danke Brandon, ich habe nur auf diese 6-stündige Verspätung gewartet, bei der ich meine eigene Frage nicht beantworten konnte.
quelle
GET
durchlassen?&& process.env.NODE_ENV === "production"
in Ihre Bedingung werfen , wenn Sie nur möchten, dass es in Ihrer Produktionsumgebung funktioniert.Die akzeptierte Antwort enthält eine fest codierte Domain. Dies ist nicht gut, wenn Sie denselben Code auf mehreren Domains haben (z. B. dev-yourapp.com, test-yourapp.com, yourapp.com).
Verwenden Sie stattdessen Folgendes:
https://blog.mako.ai/2016/03/30/redirect-http-to-https-on-heroku-and-node-generally/
quelle
req.hostname
mitreq.headers.host
vielleicht Express - Version ich bin in 4.2Ich habe ein kleines Knotenmodul geschrieben, das SSL für Expressprojekte erzwingt. Es funktioniert sowohl in Standardsituationen als auch bei Reverse-Proxys (Heroku, Nodejitsu usw.).
https://github.com/florianheinemann/express-sslify
quelle
Wenn Sie den
x-forwarded-proto
Header auf Ihrem lokalen Host testen möchten , können Sie mit nginx eine vhost-Datei einrichten, die alle Anforderungen an Ihre Knoten-App weiterleitet. Ihre nginx vhost-Konfigurationsdatei könnte folgendermaßen aussehenNginX
Die wichtigen Punkte hierbei sind, dass Sie alle Anforderungen an den localhost-Port 3000 weiterleiten (hier wird Ihre Knoten-App ausgeführt) und eine Reihe von Headern einrichten, einschließlich
X-Forwarded-Proto
Erkennen Sie dann in Ihrer App diesen Header wie gewohnt
ausdrücken
Koa
Gastgeber
Schließlich müssen Sie diese Zeile zu Ihrer
hosts
Datei hinzufügenquelle
Sie sollten einen Blick auf heroku-ssl-redirect werfen . Es wirkt wie ein Zauber!
quelle
Wenn Sie cloudflare.com als CDN in Kombination mit heroku verwenden, können Sie die automatische SSL-Umleitung innerhalb von Cloudflare auf folgende Weise aktivieren:
Melden Sie sich an und gehen Sie zu Ihrem Dashboard
Wählen Sie Seitenregeln
quelle
Loopback-Benutzer können eine leicht angepasste Version von arcseldon answer als Middleware verwenden:
server / middleware / forcessl.js
server / server.js
quelle
Dies ist eine Express-spezifischere Methode, um dies zu tun.
quelle
quelle
Mit app.use und dynamischer URL. Funktioniert sowohl lokal als auch auf Heroku für mich
quelle
Das Überprüfen des Protokolls im X-Forwarded-Proto-Header funktioniert bei Heroku einwandfrei, genau wie Derek darauf hingewiesen hat. Für was es wert ist , hier ist ein Kern der Express Middleware , die ich benutze und seinen entsprechenden Tests.
quelle