2017-09-21 51 views
0

我知道這已經被問及在這裏回答,但仍然沒有解決方案爲我工作。這裏是app.js:node.js express + aws elb - 從http重定向到https不工作

var express = require('express'); 
    var app  = express(); 

    app.all(function(req, res, next){ 
      if((!req.secure) && (req.get('X-Forwarded-Proto') !== 'https')) 
      { 
       console.log (req.get('Host')); 
       console.log("not secure"); 
       res.redirect('https://' + req.get('Host') + req.url); 
      } 
      else{ 
      console.log("secure"); 
      next(); 
      } 
     } 
    ); 

    app.use(express.static('./server/static/')); 
    app.listen(8080); 

我已經嘗試使用app.use,但它仍然無法正常工作。 我們正在使用AWS ELB,以下是聽衆:

LB Protocol | LB端口|實例協議|實例端口

HTTPS | 443 | HTTP | 8080
HTTP | 80 | HTTP | 8080

正如其他帖子所述,我的請求標題中沒有看到'x-forwarded-proto'。我相信聽衆已經正確配置,以便他們應該包含「x轉發」標題,但事實並非如此。

當我嘗試在沒有https的情況下點擊dns時,它不會被重定向到https。 但是,http和https url都能單獨工作。

請幫我弄清楚我缺少什麼或者是否需要提供更多信息。

+0

@robertklep我可以請你看看這個嗎?對於這種絕望的求助呼籲感到抱歉,但我已經看到了你對這些帖子的回答和評論。 – learner

回答

2

您可能想檢查'X-Forwarded-Proto'和'x-forwarded-proto'(小寫)。此外,請求在您的應用程序內永遠不會安全,所以您還應該刪除req.secure檢查。最終的代碼應該是這個樣子:

function forceHttps(req, res, next) { 
    const xfp = 
    req.headers["X-Forwarded-Proto"] || req.headers["x-forwarded-proto"]; 
    if (xfp === "http") { 
     const secureUrl = `https://${req.headers.hostname}${req.url}`; 
     res.redirect(301, secureUrl); 
    } else { 
     next(); 
    } 
} 

我們用我們的背後彈性負載均衡Express應用程序的代碼,並能正常工作。我們甚至創建了一個小NPM包處理這個,如果你不想寫自己的中間件:

https://www.npmjs.com/package/@crystallize/elasticloadbalancer-express-force-https

安裝

npm i --save @crystallize/elasticloadbalancer-express-force-https 

使用

const express = require('express'); 
const forceHttps = require('@crystallize/elasticloadbalancer-express-force-https'); 
const server = express(); 
server.use(forceHttps()); 

更多信息在我們的博客文章關於此: https://snowball.digital/blog/force-https-behind-elastic-load-balancer-on-a-nodejs-application