-1

80 と 443 の両方を開くように ELB を構成しました。ここで、443 は SSL で構成されています。どちらの ELB ポートも、インスタンスの 80 ポートを指しています。ELB の heatlh チェックは、ping ターゲット HTTP:80/index.html を使用しています。最近 http から https へのリダイレクトを開始することを決定するまで、以前は機能していました。

次のコードがserver.jsにあります(//内のコードは、新しく追加したコードです):

//
app.use(function(req, res, next) {
    if (config.env === 'prod' && req.get('X-Forwarded-Proto') !== 'https') {
        console.log("redirecting")
        console.log('https://' + req.get('Host') + req.url)
        res.set('X-Forwarded-Proto', 'https');
        res.redirect('https://' + req.get('Host') + req.url);
    }
    else
        next();
});
//

app.use(express.static(path.join(__dirname, 'home')));
app.set('trust proxy'); // enable this to trust the proxy

app.listen(app.get('port'), function() {
  console.log('Express server listening on port ' + app.get('port'));
});

app.get("/*", function(req, res, next) {
    res.sendFile(path.join(__dirname, 'home/index.html'));
});

上記のリクエストはすべてのリクエストを elb サーバーにリダイレクトしますが、https プロトコルを使用します。

ただし、サーバーは印刷を開始します。

redirecting
https://10.x.x.xx/index.html

そして、https://10.xxxx/inde.htmlが利用できないため、ELB は失敗します。

ただし、{domain}/ のすぐ下にある index.html の場所。

リダイレクト方法が間違っている可能性があると思いますが、修正方法がわかりません。

4

2 に答える 2

0

ロード バランサーのヘルス チェック リクエストにはx-forwarded-protoヘッダーがありません。クライアントから転送されたのではなく、ロード バランサーから直接送信されるためです。リダイレクトを行う前に、最初にヘッダーが存在するかどうかを確認する必要があるでしょう。

また、SSLの設定について少し混乱しています。ロード バランサーで SSL ターミネーションを行っていますが、EC2 サーバーでも SSL 証明書を提供していますか? 「両方の ELB ポートがインスタンスの 80 ポートを指している」と言います。これは、EC2 サーバーで SSL 証明書を提供していないことを意味するため、ヘルスチェック URLhttphttps.

また、リダイレクトの直前にあるこの行は、まったく何も達成しません:

res.set('X-Forwarded-Proto', 'https');
于 2017-02-27T22:01:52.630 に答える