2017-07-26 53 views
12

我在我的頁面上安裝了一個SSL證書,該證書運行Node.js + Express應用程序,將Express服務器配置爲始終強制重定向到HTTP並且一切正常,除了https重定向僅在重新加載頁面或再次按下Enter鍵時起作用。我錄一個GIF顯示會發生什麼:HTTPS重定向僅在頁面重新加載時才起作用

http://recordit.co/uBiW3bcQCM

這是我的Express配置。

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); 

我的應用程序在Heroku上運行。任何人都可以幫我找出發生了什麼?

在此先感謝。

回答

7

我想你的服務器在發送重定向頭之前發送內容。

如果換成:

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

爲:

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

它似乎運行得更好!

您的瀏覽器在重新載入/輸入時確實執行重定向的原因對我來說很隱晦,因爲我無法重現該行爲。在FF上我從未重定向。

這可能是由於請求標頭不同,如HEAD,而不是GET或其他。我無法對此進行更多調查,請使用Wireshark或Burpsuite確切地知道發生了什麼,如果這仍然很重要...

+0

就是這樣!感覺快樂和愚蠢的同時:) – felipeecst

3

This redirectToHTTPS()中間件應該爲你工作。即使用戶不提供前綴,它也會重定向到https站點。添加X-Forwarded-Port以識別用於https站點的端口。

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

我必須在配置中更改其他任何東西嗎?不幸的是,只有替換函數不起作用:/我設置爲這樣: – felipeecst

+0

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

+0

試試這個https://www.npmjs.com/package/express-http-to-https nodemodule。 –

相關問題