在 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的主要内容,如果未能解决你的问题,请参考以下文章