ELB の Classic Load Balancer で HTTP トラフィックを HTTPS にリダイレクトする方法を教えてください。

最終更新日: 2019 年 11 月 5 日

Elastic Load Balancing (ELB) のy Classic Load Balancer で HTTP および HTTPS リスナーを使用しています。Classic Load Balancer は SSL をオフロードし、バックエンド接続は単一の HTTP ポート (ポート 80) でリッスンします。HTTP から HTTPS (ポート 443) にトラフィックをリダイレクトしようとすると、エラー ERR_TOO_MANY_REDIRECTS が表示されます。バックエンドリスナーをポート 443 に変更することなく、このエラーを解決するにはどうすればよいですか?

簡単な説明

Classic Load Balancer は、HTTPトラフィックを HTTPS にリダイレクトすることはできません。代わりに、Classic Load Balancer の背後にある Amazon Elastic Compute Cloud (Amazon EC2) インスタンスのウェブサーバーに書き換えルールを含める必要があります。

重要: Application Load Balancer は、リダイレクトアクションを使用して HTTP トラフィックを HTTPS にリダイレクトすることができます。Classic Load Balancer を Application Load Balancer に移行すると、この機能を使用できます。

X-Forwarded-Proto ヘッダーを使用し、HTTP クライアントだけをリダイレクトするように書き換えルールを設定する必要があります。そうしないと、書き換えルールによって、Classic Load Balancer とその背後にあるインスタンスとの間にリダイレクトリクエストの無限ループが発生する可能性があります。そうしたループが、エラー ERR_TOO_MANY_REDIRECTS の原因になります。

解決方法

Apache、NGINX、IIS ウェブサーバーの以下の設定例を確認します。クライアントが HTTP または HTTPS のどちらを使用するかに基づいて、トラフィックを転送するために X-Forwarded-Proto ヘッダーを使用するように、Classic Load Balancer の背後にあるウェブサーバーを設定します。次のような書き換えルールをウェブサーバーに追加します。

  • HTTP を使用して、クライアントを HTTPS URL にリダイレクトする
  • HTTPS を直接使用してクライアントにサービスを提供する

重要: 以下の設定は、あくまでも例として提供されています。使用しているアプリケーションバージョンとユースケースに基づいてそれらを変更します。

Apache サーバー: 仮想ホストファイルメソッド (推奨)

1.    Apache 設定ファイルを開きます。存在する可能性がある場所は、/etc/httpd/conf/httpd.conf (Apache 2/httpd の場合)、 /etc/apache2/sites-enabled/ (Apache 2.4 の場合)、 /etc/apache2/apache2.conf (Apache on Ubuntu の場合) のいずれかです。

2.    以下のように、設定ファイルの VirtualHost セクションに書き換えルールを追加します。

<VirtualHost *:80>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
</VirtualHost>

3.    Apache 設定ファイルを保存します。

4.    Apache を再起動します。

Apache サーバー: .htaccess ファイルメソッド (推奨されません)

警告: 前のセクションで説明した Apache 仮想ホストファイルメソッドを使用するのがベストプラクティスです。Apache .htaccess ファイルのガイドラインによると、.htaccess ファイルを使用するのは、メインの Apache 設定ファイルにアクセスできない場合だけです。

1.    Apache 設定ファイルを開きます。存在する可能性がある場所は、/etc/httpd/conf/httpd.conf (Apache 2/httpd の場合) または /etc/apache2/sites-enabled/ (Apache 2.4 の場合) のどちらかです。

2.    以下のように Directory ディレクティブを編集して、.htaccess を有効にします。

 <Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

3.    Apache 設定ファイルを保存します。

4.    .htaccess ファイルを開きます。

5.    以下のような書き換えルールを追加します。

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

6.    .htaccess ファイルを保存します。

7.    Apache を再起動します。

NGINX サーバー

注意: この解決方法は、NGINX 1.10.3 (Ubuntu) と NGINX 1.12.1 (Amazon Linux) に適用されます。

1.    NGINX 設定ファイル (nginx.conf) を開きます。

2.    以下のサンプルの書き換えルールを追加します。設定に合わせて、書き換えルールを変更することを忘れないでください。

server {
    listen 80;
    server_name _;
    if ($http_x_forwarded_proto = 'http'){
    return 301 https://$host$request_uri;
    }
}

3.    NGINX を再起動します。

IIS サーバー

注意: この解決方法は、Microsoft Windows Server 2012 R2 および 2016 Base に適用されます。

1.    Microsoft から IIS URL 書き換えモジュールをインストールします。

2.    web.config ファイルを開きます。

3.    以下のサンプルの書き換えルールを <system.webServer> セクションに追加します。固有の設定に合わせて、書き換えルールを変更することを忘れないでください。

<rewrite>
    <rules>
        <rule name="Rewrite HTTP to HTTPS" stopProcessing="true">
            <match url="^(.*)$"/>
            <conditions logicalGrouping="MatchAny">
                <add input="{HTTP_X_FORWARDED_PROTO}" pattern="^http$"/>
            </conditions>
            <action type="Redirect" url="https://{HTTP_HOST}/{R:1}"/>
        </rule>
    </rules>
</rewrite>

4.    web.config ファイルを保存します。

5.    IIS Manager を開きます。

6.    デフォルトのウェブサイトを更新します。

7.    新しい書き換えルールが URL 書き換えセクションに表示されていることを確認します。

8.    ウェブサイトを再起動します。

9.    リダイレクションが機能していることを確認します。