截至今天(2014年10月10日),使用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.get('*',function(req,res,next){ if(req.headers['x-forwarded-proto']!='https') res.redirect('https://mypreferreddomain.com'+req.url) else next() })