为了账号安全,请及时绑定邮箱和手机立即绑定

Heroku NodeJS http到https ssl强制重定向

Heroku NodeJS http到https ssl强制重定向

呼如林 2019-11-06 11:05:02
我有一个应用程序在heroku上运行,并在带有https的节点上运行express。我该如何识别协议以在heroku上使用nodejs强制重定向到https?我的应用程序只是一个简单的http服务器,它(尚未)意识到heroku正在向其发送https请求:/* Heroku provides the port they want you on in this environment variable (hint: it's not 80) */app.listen(process.env.PORT || 3000);
查看完整描述

3 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

使用Heroku Cedar stack和ExpressJS〜3.4.4,这是一个工作代码集。


这里要记住的主要事情是我们正在部署到Heroku。SSL终止发生在负载平衡器上,然后加密的流量到达您的节点应用程序。可以通过req.headers ['x-forwarded-proto'] ==='https'测试是否使用https发出请求。


如果您在其他环境中托管,则无需担心在应用程序等内部是否具有本地SSL证书。但是,如果使用自己的证书,子域等,则应首先通过Heroku加载项应用SSL加载项。


然后只需添加以下内容即可完成从HTTPS到HTTPS以外的任何重定向。这与上面接受的答案非常接近,但是:


确保您使用“ app.use”(用于所有操作,而不仅仅是获取)

明确将forceSsl逻辑外部化为声明的函数

不要将'*'与“ app.use”一起使用-当我测试它时,这实际上失败了。

在这里,我只想在生产中使用SSL。(根据您的需要进行更改)

码:


 var express = require('express'),

   env = process.env.NODE_ENV || 'development';


 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.configure(function () {


    if (env === 'production') {

        app.use(forceSsl);

    }


    // other configurations etc for express go here...

}

对SailsJS(0.10.x)用户的注释。您可以在api / policies中简单地创建一个策略(enforceSsl.js):


module.exports = function (req, res, next) {

  'use strict';

  if ((req.headers['x-forwarded-proto'] !== 'https') && (process.env.NODE_ENV === 'production')) {

    return res.redirect([

      'https://',

      req.get('Host'),

      req.url

    ].join(''));

  } else {

    next();

  }

};

然后参考config / policies.js以及其他任何策略,例如:


'*':['已验证”,'enforceSsl']


查看完整回答
反对 回复 2019-11-06
  • 3 回答
  • 0 关注
  • 786 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信