web-dev-qa-db-ja.com

AWS Application Load BalancerでHTTPをHTTPSにリダイレクトする方法は?

私たちのウェブサイトはHIPAAに準拠する必要があるため、すべてを暗号化する必要があります。クライアントが "http://mysite.com"を入力したときにエラーメッセージが表示されないようにしたいので、HTTPとHTTPSの両方をサポートし、HTTPをHTTPSにリダイレクトする必要があります。私は正しいですか?

私はウェブサーバーでそれを正しく行いました。したがって、Webサーバーに直接接続すると、HTTPは自動的にHTTPSにリダイレクトされます。すべて良い。

しかし、ウェブサーバーはAWS Application Load Balancerの背後にあります。 ELBでHTTPをHTTPSにリダイレクトする方法がわかりません。したがって、client browsersは、HTTP経由でELBに接続できます。

AWS Application Load BalancerでHTTP => HTTPSを設定するにはどうすればよいですか?

つまり、ELBとWebサーバー間の接続がHTTPSであることは確かですが、クライアントブラウザーとELB間の接続がHTTPSであることを確認するにはどうすればよいですか。

12
Silly Dude

2018年7月現在 、これはアプリケーションロードバランサーでサポートされています。

  • HTTP:80リスナーを追加/編集
  • アクションをRedirectに設定します
  • プロトコル:https
  • ポート:443
  • 次のドロップダウンをOriginal Host, path, queryに設定します
  • 最後のドロップダウンを301 - Permanently movedに設定します

AWSアプリケーションロードバランサーのHTTP to HTTPSリスナーの設定の画像

11
John Pope

通常、ELBはhttps(ポート443)を受信し、http(ポート80)でEC2インスタンス(ロードバランサーターゲット)に転送するように設定されています。

バックエンドWebサーバーはこれらのリクエストをロードバランサーのポート443にリダイレクトし、リダイレクトの無限ループ(ロードバランサーとバックエンドWebサーバーの間)を引き起こします。

一般的なエラーメッセージはERR_TOO_MANY_REDIRECTS

解決策は、リダイレクトを決定するときに、ロードバランサーから見たプロトコルであるX-Forwarded-Protoを確認することです。

Nginxの場合、設定は次のようになります。

server {
    listen   80;
    server_name    www.example.org;   
    if ($http_x_forwarded_proto = 'http') {
         return 301 https://$server_name$request_uri;   
    }
}

そして、Apache .htaccessの場合は次のようになります。

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

注:これをWebサーバーの再構成なしで処理できれば便利だと思うかもしれませんが、2018年の春以降、ELBだけを使用してこれを解決する方法はありません。これを機能させます。

1
sandstrom