HTTPSredirect仅在重新加载页面时起作用

我在我的页面上安装了一个SSL证书,该证书运行一个Node.js + Express应用程序,configurationExpress服务器始终强制redirect到HTTP,一切正常,除了httpsredirect只适用于页面重载或者回车键再次按下。 我logging了一个gif来显示发生了什么:

http://recordit.co/uBiW3bcQCM

这是我的快速configuration。

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上运行。 任何人都可以帮我找出发生了什么?

提前致谢。

我认为你的服务器在发送redirect头之前正在发送内容。

如果你换了:

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

对于:

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

它似乎工作得更好!

浏览器在reload / enter上执行redirect的原因对我来说是模糊的,因为我无法重现这种行为。 在FF我从来没有redirect。

这可能是由于请求标头不同,如HEAD,而不是GET或其他。 我无法调查更多,使用Wireshark或Burpsuite确切地知道发生了什么,如果这仍然重要…

这个redirectToHTTPS()中间件应该为你工作。 即使用户不提供前缀,它也会redirect到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() } }