node.js - HTTPS 重定向仅在页面重新加载时有效

标签 node.js express ssl heroku https

我在我的页面上安装了 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 上运行。谁能帮我看看发生了什么?

提前致谢。

最佳答案

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

如果你交换:

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

为:

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

它似乎工作得更好!

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

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

关于node.js - HTTPS 重定向仅在页面重新加载时有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45337520/

相关文章:

node.js - Arangodb foxx-application 性能不佳

node.js - Passport 失败并出现 404 - GitHub 的 InternalOAuthError 为什么?

mysql - EJS 中用户定义的 MySQL 变量

ssl - ECDSA 证书可以有 RSA 签名吗?

tomcat - 使用 Spring Security : This webpage has a redirect loop 启用 HTTPS

node.js - Cheerio 给出奇怪的结果

javascript - 类型 [type] 的参数不可分配给类型 [type] 的参数

javascript - 代理 Node 请求新端口并充当反向代理

java - Websphere 8.5 上的 SSL handshake_failure(在 Tomcat 上工作)

javascript - 从mysql文本类型显示换行符到ejs