在 Heroku 上为 Node.js 应用程序强制使用 HTTPS

Posted

技术标签:

【中文标题】在 Heroku 上为 Node.js 应用程序强制使用 HTTPS【英文标题】:Forcing HTTPS for Node.js app on Heroku 【发布时间】:2014-09-27 05:50:42 【问题描述】:

我在部署到 Heroku 的 node.js 应用程序上强制使用 SSL 时遇到了一些问题。我想在所有场景中强制使用 HTTPS。我也在用 Express。

我已经按照这篇文章的代码:Heroku NodeJS http to https ssl forced redirect (来自 arcseldon 的回答)。

我正在 Chrome 中进行测试。

这是我的测试场景: 如果我访问 www.mywebsite.com,它会重定向到 https://www.mywebsite.com -> 这按我的预期工作。

现在我在https://www.mywebsite.com。如果我进入 Chrome 中的 URL 并将“https”编辑为“http”,然后按 Enter。它只是通过 http 建立连接(我检查了 Chrome 开发人员工具)。

这是我的代码的 sn-ps,以防我做错了什么。

var forceSsl = function (req, res, next) 
    if ( req.headers['x-forwarded-proto'] != 'https')
      console.log( 'forceSSL req.get = ' + req.get('Host') + ' req.url = ' + req.url );
      return res.redirect('https://' + req.get('Host') + req.url );
     else 
      console.log( 'No need to re-direct to HTTPS' );
      next();
    
;

if ('development' == app.get('env')) 
  console.log('Started in dev mode');
  // Other code here

 else if ('production' == app.get('env')) 
  console.log('Started in PROD mode');
  app.use(forceSsl);
  app.use('/public', express.static(__dirname + '/public'));
  app.use(express.errorHandler());
  mongoose.connect(process.env.MONGOHQ_URL);

附带说明,我从未在“forceSsl”函数中看到控制台消息。

我已将我的域配置为指向 heroku 应用的 SSL 版本,所以我不知道它是如何通过 HTTP 建立连接的。

非常感谢您的帮助。

编辑: 在上面我认为它在 Chrome 中工作的测试用例中,我认为 Chrome 正在干预和重定向,因此它可能无法按预期工作。

当我通过 curl 进行测试时,我可以看到该站点通过 HTTP 接受请求并且不执行重定向。

【问题讨论】:

【参考方案1】:

我想我解决了我的问题。我正在使用一个 Google Angular 应用程序,它作为静态文件从公共目录中提供。 Express 'app.use' 中我的公共目录的声明高于我的 'app.use(forceSsl);'。

因此,我的公共目录中的静态文件(例如我的 Angular 应用程序)在它们到达我的重新路由代码之前就已经被提供了。使用 Express,如何使用“app.use”语句的顺序很重要。

我为我的公共目录重新订购了“app.use”,使其位于“app.use(forceSsl);”下方它似乎有效。

希望这能帮助遇到类似问题的其他人。

【讨论】:

【参考方案2】:

这是一个使用 html5 url 的完整示例:

var express = require('express');
var http = require('http');

var app = express();

app.use(express.static('' + __dirname,index:false));

app.use('/*', function(req, res)
  if(req.headers['x-forwarded-proto']!=='https')
    res.redirect(301, 'https://apps.iazi.ch'+req.url);
  
  res.sendFile(__dirname + '/index.html');
);

var server = http.createServer(app);
server.listen(process.env.PORT || 5000);

【讨论】:

以上是关于在 Heroku 上为 Node.js 应用程序强制使用 HTTPS的主要内容,如果未能解决你的问题,请参考以下文章

Heroku 上的 Socket.io:客户端代码

部署 Node.js 应用程序时出现 Heroku 错误

为啥我的 Flask 应用程序在 Heroku 上被检测为 node.js

无法在 heroku 上推送 node.js 应用程序

Node.js 应用程序无法在 heroku 上启动

Heroku 中的 Node.js