2017-03-10 65 views
1

我正在使用Cloud9和Heroku開發基於MEAN堆棧的Web應用程序。我希望所有用戶都被強制使用HTTPS,我發現用快遞中間件的一個好方法:Node/express - 如何在不被CORS阻止的情況下強制使用HTTPS

app.use(function(req,res,next) { 
    if(req.headers["x-forwarded-proto"] == "http") { 
     console.log("HTTP call detected, not allowed); 
     return res.redirect('https://' + req.hostname + req.path); 
    } else { 
     console.log("HTTPs call detected, allowed"); 
     return next(); 
    } 

我希望這能工作對所有GET,POST,PUT,DELETE我收到請求,認爲任何呼叫到HTTP應該被重定向到相同的相應的HTTPS請求。

現在,雖然這本身似乎工作,我得到了CORS策略錯誤

的XMLHttpRequest無法加載 https://myappurlhere.herokuapp.com/app。否 「訪問控制 - 允許來源」標題出現在請求的 資源中。 Origin'http://myappurlhere.herokuapp.com'是 因此不允許訪問。響應有HTTP狀態代碼401

現在我明白這個概念,這是標準的CORS政策,防止跨域請求,但我不完全知道應該怎麼處理這個。我認爲這將作爲一個同域請求,但顯然不是。

我看到有人認爲第二臺服務器應該運行並捕獲HTTP流量,重定向,但我只使用一臺服務器。我不明白爲什麼這是行不通的。

任何幫助非常感謝。

問候

回答

0
function requireHTTPS(req, res, next) { 
    if (!req.secure) { 
      return res.redirect('https://' + req.get('host') + req.url); 
    } 
     next(); 
} 
app.use(requireHTTPS); 

這爲我工作。

0

我現在強迫HTTPS流量,但我不認爲我解決了實際問題。我現在使用的是:

app.use(function (req, res, next) { 
    res.setHeader('Strict-Transport-Security', 'max-age=8640000; includeSubDomains'); 
    if (req.headers['x-forwarded-proto'] && req.headers['x-forwarded-proto'] === "http") { 
     return res.redirect(301, 'https://' + req.host + req.url); 
    } else { 
     console.log("HTTPS call detected"); 
     return next(); 
    } 
}); 

看起來,這可能是因爲頭部更改而導致嚴格的TLS生效。但是,這也意味着重定向似乎不會發生 - 對「http」的測試始終是錯誤的。因此,COTS重定向策略的問題依然存在。

這是我真的很喜歡一些輸入 - 我應該添加一些允許跨域請求的策略嗎?這聽起來不安全,爲什麼?我在同一個域上,我只想要HTTPS。

任何輸入讚賞。

相關問題