猿问

Heroku NodeJS http到https ssl强制重定向

我有一个应用程序在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);


呼如林
浏览 787回答 3
3回答

湖上湖

使用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']
随时随地看视频慕课网APP

相关分类

Node.js
我要回答