2017-07-26 127 views
12

Sayfamda bir Node.js + Express uygulaması çalıştıran bir SSL sertifikası yükledim, her zaman HTTP'lere yönlendirmeyi zorlamak için Express sunucusunu yapılandırdı ve her şey iyi çalışıyor. Yönlendirme sadece sayfa yeniden yüklendiğinde veya Enter tuşuna tekrar basıldığında çalışır.HTTPS yönlendirmesi yalnızca sayfa yeniden yüklendiğinde çalışır

http://recordit.co/uBiW3bcQCM

Ve işte benim Ekspres yapılandırma var: Ben ne olduğunu göstermek için bir gif kaydedildi.

var express = require('express'); 
var path = require('path'); 
var serveStatic = require('serve-static'); 

var forceSsl = function (req, res, next) { 
    if (req.headers['x-forwarded-proto'] !== 'https') { 
    return res.redirect(['https://', req.get('Host'), req.url].join('')); 
    } 
    return next(); 
}; 

app = express(); 
app.use(serveStatic(__dirname)); 

if(process.env.NODE_ENV === 'production') { 
    app.use(forceSsl); 
} 

app.all('/*', function(req, res) { 
    res.sendfile('index.html'); 
}); 

var port = process.env.PORT || 5000; 
app.listen(port); 

console.log('server started '+ port); 

Uygulamam Heroku üzerinde çalışır. Neler olup bittiğini öğrenmeme yardım edebilir mi?

Şimdiden teşekkürler.

cevap

7

Sunucunuzun yeniden yönlendirme üstbilgileri göndermeden önce içeriği gönderiyor olduğunu düşünüyorum.

Eğer takas edin: için

app.use(serveStatic(__dirname)); 
app.use(forceSsl); 

:

app.use(forceSsl); 
app.use(serveStatic(__dirname)); 

çok daha iyi iş gibi görünüyor!

Tarayıcınızın yeniden başlatma/girişte yeniden yönlendirme yapmasının nedeni, davranışı yeniden oluşturamadığım için belirsiz. FF'de asla yönlendirilmedim.

İstek başlıklarının farklı olması, örneğin bir GET yerine başka bir BAŞ veya başka bir şey olabilir. Bu konuda daha fazla araştırma yapamadım, tam olarak ne olacağını bilmek için Wireshark veya Burpsuite kullan, eğer hala önemliyse ...

+0

İşte bu kadar! Aynı anda mutlu ve aptal hissetmek :) – felipeecst

3

Bu redirectToHTTPS() ara katman yazılımı sizin için çalışmalıdır. Kullanıcı, önek sağlamadığında bile https sitesine yönlendirir. Https sitesi için kullanılan bağlantı noktasını tanımlamak için X-Forwarded-Port ekleyin.

function redirectToHTTPS() { 
    return function middlewareRedirectToHTTPS (req, res, next) { 
    const isNotSecure = (!req.get('x-forwarded-port') && req.protocol !== 'https') || 
     parseInt(req.get('x-forwarded-port'), 10) !== 443 
    if (isNotSecure) { 
     return res.redirect('https://' + req.get('host') + req.url) 
    } 
    next() 
} 
} 
+0

Yapılandırmamda başka bir şey değiştirmek zorunda mıyım? Ne yazık ki, yalnızca işlevin değiştirilmesi işe yaramadı:/Şu şekilde ayarlıyorum: – felipeecst

+0

"if (process.env.NODE_ENV === 'production') { app.use (redirectToHTTPS()); } ' – felipeecst

+0

Bu https://www.npmjs.com/package/express-http-to-https nodemodule programını deneyin. –