2015-10-05 9 views
9

私は、単一ページのAngularアプリケーション用の静的資産を提供する簡単なExpress.jsインスタンスを用意しています。私はすべてのルートに対してindex.htmlが返されるようにExpress設定でミドルウェアを設定し、そこからAngularをロードすることができます。Express.jsをHTTPSにリダイレクトしてindex.htmlを送信

最近、私はHerokuでSSLを設定しました.HTTPから送信されるすべてのトラフィックがHTTPSにリダイレクトされるようにしたいと考えています。私はthis postの提案されたソリューションを私が今持っているものと組み合わせようとしましたが、無限のリダイレクトループで終わります。

要するに、すべてのトラフィックをHTTPからHTTPSにリダイレクトし、すべての要求に対してindex.htmlファイルを送信する必要があります。私はここで間違って何をしていますか? Herokuののロードバランサへの接続は、このように無限のリダイレクトループを作成し、SSLを使用していないので、

var gzippo = require('gzippo'); 
var express = require('express'); 
var morgan = require('morgan'); 
var app = express(); 

// set environment variables 
var env = app.get('env') || 'development'; 

app.use(morgan('dev')); 

// serve static assets 
app.use(gzippo.staticGzip("" + __dirname + "/dist")); 
app.use("/js", express.static(__dirname + "/dist/scripts")); 
app.use("/fonts", express.static(__dirname + "/fonts")); 
app.use("/img", express.static(__dirname + "/dist/assets/images")); 
app.use("/css", express.static(__dirname + "/dist/styles")); 


// Redirect all HTTP traffic to HTTPS 
function ensureSecure(req, res, next){ 
    if(req.secure){ 
    // OK, continue 
    return next(); 
    }; 
    res.redirect('https://'+req.hostname+req.url); // handle port numbers if you need non defaults 
}; 


// Always send index.html 
function sendIndex(req, res, next) { 
    res.sendfile('index.html', { root: __dirname + "/dist/"}); 
} 


// Handle environments 
if (env == 'production') { 
    app.all('*', ensureSecure); 
} 

app.all('/*', sendIndex); 

// Start server 
app.listen(process.env.PORT || 5000); 

答えて

16

Herokuのは、ロードバランサレベルでのSSL接続を終了し、そうreq.secureは、真なることはありません。

あなたが代わりにX-Forwarded-Protoヘッダをチェックする必要があります。

if(req.headers["x-forwarded-proto"] === "https"){ 
    // OK, continue 
    return next(); 
}; 
res.redirect('https://'+req.hostname+req.url); 

編集を:あなたはまた、ヘッダー自動的エクスプレスチェックインを持っているapp.enable("trust proxy")を設定することができます。 http://expressjs.com/guide/behind-proxies.html

+0

これは私にとってはうまくいくようです。私がここに持っている他の唯一の問題は、他のルートでのみ、ルートにリダイレクトを適用しないことです。私は '' 'app.all'''を' '' 'app.use(ensureSecure);' ''に変更してみました。その上の任意のアイデア? –

+0

@WillHitchcockはい、私はapp.allの代わりにapp.useを使用することを提案しようとしていましたが、これがうまくいかない場合は何が問題なのかわかりません。その場合に起こることを追跡するために、さらにログを追加してみてください。 – Philippe

+1

私はそれが分かったと思う。私はちょうど '' 'app.use(gzippo ...' '')の前にリダイレクトを置く必要がありました。作業中です! –

関連する問題