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

我在部署到Heroku的node.js应用程序中强制使用SSL。 我想在所有场景中强制使用HTTPS。 我也使用Express。

我已经遵循这个职位上的代码: Heroku的NodeJS HTTP到HTTPS强制redirect (从arcseldon的答案)。

我正在使用Chrome进行testing。

这里是我的testing场景:如果我去www.mywebsite.com,它redirect到https://www.mywebsite.com – >这是工作正如我所料。

现在我在https://www.mywebsite.com 。 如果我在Chrome浏览器中访问url,并将“https”编辑为“http”,则会进入。 它只是通过http进行连接(我login了Chrome开发者工具)。

这是我的代码片段,以防我做错了事情。

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'函数中的控制台消息。

我已经configuration我的域指向的Heroku应用程序的SSL版本,所以我不知道它是如何通过HTTP进行连接。

非常感谢您的帮助。

编辑:在上面的testing案例中,我认为它在Chrome中工作,我认为Chrome是干预和重新定向,所以它可能不会按预期工作。

当我通过curltesting时,我可以看到该网站通过HTTP接受请求,并没有做一个redirect。

我想我解决了我的问题。 我正在使用Google Angular应用程序作为静态文件从公共目录中提供。 快速“app.use”中我公开目录的声明位于我的'app.use(forceSsl)'之上。

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

我重新命令我的公共目录下的'app.use'在'app.use(forceSsl)'下面。 它似乎工作。

希望这会帮助有类似问题的其他人。

这是一个使用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);