我有一個使用 websocket 與 Node.js Express 服務器通信的 web 應用程式。
在驗證 websocket 連接時,我檢查請求的 ORIGIN 標頭(以及一些其他引數以確保它們是合法的)
預期的請求是“https://www.mywebsite.com”或“https://mywebsite.com”
如果 ORIGIN 標頭不是預期的,我們將踢出用戶。
然后我注意到當他們的套接字連接看起來不錯時,有些人可能會被踢,但 ORIGIN 是“http://mywebsite.com”。我們很快查了一下,發現網站可以用http訪問了。我們添加了一段重定向代碼,如下所示:
const server = express()
.enable('trust proxy')
.use((req, res, next) => {
req.secure ? next() : res.redirect('https://' req.headers.host req.url)
})
而現在理論上,任何訪問http版本的網站的人都應該被重定向到https。
但是,即使完成了這種重定向,我們仍然注意到有人被踢,因為他們的來源是 http 而不是 https。為什么會這樣?有沒有可能某些用戶永遠無法使用 https?
uj5u.com熱心網友回復:
這是在 Heroku 上重定向到 https 的正確方法:
在底層,Heroku 路由器(覆寫)寫入 X-Forwarded-Proto 和 X-Forwarded-Port 請求標頭。應用程式必須檢查 X-Forwarded-Proto 并在不是 https 而是 http 時使用重定向回應進行回應。
取自:https ://help.heroku.com/J2R1S4T8/can-heroku-force-an-application-to-use-ssl-tls
這是您可以使用的一些示例代碼:
app.use((req, res, next) => {
if (req.header('x-forwarded-proto') !== 'https') {
res.redirect(`https://${req.header('host')}${req.url}`)
} else {
next()
}
})
您的代碼不起作用的原因是 Heroku 為您執行 SSL 終止并提供證書,這意味著 Heroku 路由器和您的 Node.js 服務器之間的連接不安全并req.secure回傳 false:
https ://devcenter.heroku.com/文章/http-routing#routing
更正:因為您設定了信任代理,這意味著 req.protocol 將設定為 https 并且 req.secure 將回傳 true 以便您的代碼可以正常作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/449380.html
