【问题标题】:HTTPS redirection only works when page is reloadedHTTPS 重定向仅在页面重新加载时有效
【发布时间】:2018-01-02 09:36:00
【问题描述】:

我在我的页面上安装了 SSL 证书,该证书运行 Node.js + Express 应用程序,将 Express 服务器配置为始终强制重定向到 HTTPs 并且一切正常,除了 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 上运行。谁能帮我看看发生了什么?

提前致谢。

【问题讨论】:

    标签: node.js express ssl heroku https


    【解决方案1】:

    这个 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()
    }
    }
    

    【讨论】:

    • 我是否需要更改配置中的其他内容?不幸的是,仅替换该功能不起作用:/我是这样设置的:
    • if(process.env.NODE_ENV === 'production') { app.use(redirectToHTTPS()); }
    • 试试这个npmjs.com/package/express-http-to-https nodemodule。
    • @felipeecst 你是否监听了 443 端口的 https。看看这个答案stackoverflow.com/questions/22453782/…var httpServer = http.createServer(app); var httpsServer = https.createServer(credentials, app); httpServer.listen(8080); httpsServer.listen(8443);
    【解决方案2】:

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

    如果你交换:

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

    为:

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

    它似乎工作得更好!

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

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

    【讨论】:

    • 就是这样!同时感到快乐和愚蠢:)
    猜你喜欢
    • 1970-01-01
    • 2021-06-29
    • 2019-03-04
    • 2021-07-18
    • 1970-01-01
    • 2017-03-07
    • 2014-05-03
    • 2011-11-19
    相关资源
    最近更新 更多