2015-12-03 16 views
1

我最近在我的網站中添加了SSL證書。添加HTTPS支持後,我想將人員重定向到安全連接。我用google搜索瞭解如何檢測HTTPS,並在Stack上找到許多不同的方法。它接縫他們爲別人工作,但他們不爲我工作。在4種檢查安全連接的方式中,只有一種可以工作。檢測ExpressJS下的HTTPS僅適用於4種方法中的1種

什麼不爲我工作:

  • req.secure:總是返回即使我手動把https://開頭
  • req.connection.encrypted:總是返回undefined即使我手動輸入https://
  • req.protocol:總是返回HTTP即使我把手動https://開頭

什麼工作:

req.headers [ 'X轉發,原']是實際返回現實的唯一途徑。

認識到這一點我重定向到以下列方式建立安全連接:

// Check if the connection is secure, if not, reddiret to a secure one. 
function requireHTTPS(req, res, next) { 
    if(process.env.NODE_ENV == 'production') { 
     if (req.headers['x-forwarded-proto'] !== 'https') { 
      return res.redirect('https://' + req.get('host') + req.url); 
     } 
    } 

    next(); 
} 

app.use(requireHTTPS); 

在我,因爲即使重定向到HTTPS後,上面提到我會得到一個重定向循環任何其他方式,上述方法將返回falsehttp

我的問題是:爲什麼其他方法不起作用?

技術規格:

  • 網站:https://simpe.li
  • 託管在Heroku
  • 節點版本:4.1.1
  • 快遞:4.13.0

回答

4

Heroku的公開HTTPS爲你,然後將標準HTTP代理給您的工作人員。 req.headers['x-forwarded-proto']方法是在Heroku下檢測HTTPS的正確方法。同樣,如果您需要始發IP地址和端口,則需要訪問x-forwarded-forx-forwarded-port

Heroku Routing文檔有關於其路由結構的更多詳細信息。

+0

史詩!感謝您提供簡短而明確的答案。 –

相關問題