本日2014年10月10日現在、Heroku Cedarスタックと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から他のポリシーとともに参照します。例:
'*':['authenticated'、 'enforceSsl']
app.get('*',function(req,res,next){ if(req.headers['x-forwarded-proto']!='https') res.redirect('https://mypreferreddomain.com'+req.url) else next() })