HTTPS重定向仅在重新加载页面时有效

时间:2017-07-26 21:12:26

标签: node.js express ssl heroku https

我在我的页面上安装了SSL证书,该证书运行Node.js + Express应用程序,配置Express服务器始终强制重定向到HTTP,一切正常,但https重定向仅在重新加载页面时有效或再次按下Enter键时。我录制了一个gif来展示会发生什么:

http://recordit.co/uBiW3bcQCM

这是我的Express配置。

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上运行。谁能帮我找出发生了什么?

提前致谢。

2 个答案:

答案 0 :(得分:6)

我认为您的服务器在发送重定向标头之前正在发送内容。

如果你交换:

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

有:

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

似乎工作得更好!

您的浏览器在重新加载/输入时执行重定向的原因对我来说是模糊的,因为我无法重现该行为。在FF上,我从未被重定向。

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

答案 1 :(得分:2)

redirectToHTTPS()中间件应该适合您。即使用户没有提供前缀,它也会重定向到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()
}
}