2017-03-12 9 views
1

Ich baue eine Website mit NodeJS und stelle sie auf Heroku bereit. Aber als ich die Website öffnete, ging etwas schief. Hier ist das Problem:NodeJS: HTTPS-Anforderung senden, aber HTTP erhalten

Code: In der Hauptquelldatei meiner Web:

app.get('/', (req, res) => { 
    var data = { 
     rootURL: `${req.protocol}://${req.get('Host')}`, 
    }; 

    res.render('home.html', data); 
}); 

Dann in home.html, schließe ich das folgende Skript:

<script type="text/javascript"> 
    $.getJSON('{{rootURL}}'+'/about', {}, function(data){ 
     // Code here is deleted for now. 
    }).fail(function(evt) { 
     // Code here is deleted for now. 
    }); 
</script> 

Here I Verwenden Sie die Vorlage "hbs", sodass {{rootURL}} gleich der Eigenschaft 'rootURL' innerhalb des Objekts 'data' ist, das zusammen mit der Seite 'home.html' gerendert wird. Das '/ about' ist eine der APIs, die ich für mein Web entworfen habe. Es sendet im Grunde etwas über die Website selbst zurück und diese Informationen sind in JSON verpackt.

Dann kommt hier das Problem. Der Code funktioniert lokal gut und funktioniert gut, wenn ich eine HTTP-Anforderung anstelle von HTTPS an Heroku sende. Aber wenn ich HTTPS-Anforderung an Heroku senden, werde ich 'Mixed Content' Fehler erhalten: Errors I get in Chrome Console.

Ich wechselte dann zu 'Elemente' Reiter in dem Entwickler-Tool, und ich sah diese: The schema is HTTP, not HTTPS!

I bin hier sehr verwirrt. Ich nehme einfach die "Protokoll" -Eigenschaft innerhalb des "req" -Objekts und fülle die Vorlage damit aus. Also nehme ich an, wenn ich in meinem Chrome-Browser '[my-website-name] .herokuapp.com' mit 'https' schema eintrage, sollte meine auf Heroku bereitgestellte nodeJS-App 'https' für req.protocol erhalten. Aber anscheinend ist es nicht der Fall. Was ist hier falsch?

Antwort

1

Ich nehme an, Sie haben kein SSL-Zertifikat? Heroku wird das HTTPS bereitstellen, aber es wird es dann intern in normales HTTP übersetzen, wenn es Ihren Express-Endpunkt erreicht, weshalb es req.protocol als HTTP sieht.

Gibt es einen Punkt in der Bereitstellung der URL zu getJSON? Warum senden Sie es nicht einfach und lassen Sie den Browser damit umgehen?

Außerdem haben Sie Ihre URL in diesem ersten Bild, das Sie hochgeladen haben, nicht versteckt, falls Sie das beabsichtigt haben.

+0

Vielen Dank! Schätze es wirklich! Ja, du hast recht. Es macht keinen Sinn, dort die vollständige URL zu verwenden. Und die URL im ersten Bild ist nicht das, was ich beabsichtigt habe .... – codeavor

1

Heroku Router macht SSL-Terminierung, also egal, ob Sie über http oder https verbinden, erhalten Sie http auf Ihrer Seite. Das ursprüngliche Protokoll wird jedoch in X-Forward-Proto Header festgelegt. Sie müssen diesen Wert verwenden.