web-dev-qa-db-ja.com

EC2 Elastic Load BalancerをHTTPからHTTPSにリダイレクトする

ELB ですべてのHTTPリクエストをhttpsリクエストにリダイレクトします。 2つのEC2インスタンスがあります。サーバーにnginxを使用しています。私は成功せずにnginxのconfファイルを書き直そうとしました。私はそれにいくつかのアドバイスが大好きです。

89
Amit Badheka

AWS Application Load Balancerは、ネイティブHTTPからHTTPSへのリダイレクトをサポートするようになりました。

コンソールでこれを有効にするには、次の手順を実行します。

  1. EC2のロードバランサーに移動し、[リスナー]タブをクリックします
  2. HTTPリスナーで「ルールの表示/編集」を選択します
  3. デフォルトのルール(下)を除くすべてのルールを削除する
  4. デフォルトルールの編集:アクションとして「リダイレクト」を選択し、すべてをデフォルトのままにして、ポートとして「443」を入力します。

Native redirect listener rule

here で説明されているように、CLIを使用しても同じことが実現できます。

Cloudformationでこれを行うこともできます。この場合、次のようにListenerオブジェクトを設定する必要があります。

  HttpListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      LoadBalancerArn: !Ref LoadBalancer
      Port: 80
      Protocol: HTTP
      DefaultActions:
      - Type: redirect 
        RedirectConfig:
          Protocol: HTTPS
          StatusCode: HTTP_301
          Port: 443

引き続きクラシックロードバランサーを使用する場合は、他で説明されているNGINX構成のいずれかを使用します。

55
Ulli

ELBはX-Forwarded-Protoヘッダーを設定します。これを使用して、元のリクエストがHTTPであったかどうかを検出し、HTTPSにリダイレクトできます。

server confでこれを試すことができます:

if ($http_x_forwarded_proto = 'http') {
    return 301 https://yourdomain.com$request_uri;
}

ELB docs をご覧ください。

105
Dmitry Mukhin

私は同じ問題を抱えていました。私の状況では、HTTPSはELBによって完全に処理され、ソースドメインが事前にわからなかったため、次のようなことをしました。

server {
  listen 81;
  return 301 https://$Host$request_uri;
}

server {
  listen 80;
  # regular server rules ...
}

そしてもちろん、ELB「https」がインスタンスポート80を指し、次に「http」ルートがインスタンスポート81を指すようにします。

32
TylerFowler

Amazon Elastic Load Balancer(ELB)は、X-FORWARDED-PROTOと呼ばれるHTTPヘッダーをサポートします。 ELBを通過するすべてのHTTPS要求の値は、「HTTPS」に等しいX-FORWARDED-PROTOになります。 HTTP要求の場合、次の単純な書き換えルールを追加することにより、HTTPSを強制できます。私にとってはうまくいきます!

Apache

.htaccessファイルに次の行を追加できます。

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}

または、同じEC2 Webサーバーで複数のドメインを管理するためにvhost.confを使用する場合、vhost.confに以下を追加できます(httpsを使用するドメインに追加できます)。

<VirtualHost *:80>
...
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}
...
</VirtualHost>

IIS

構成GUIを使用してIIS Url-Rewriteモジュールをインストールし、以下の設定を追加します。

<rewrite xdt:Transform="Insert">
<rules>
<rule name="HTTPS rewrite behind ELB rule" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions>
<add input="{HTTP_X_FORWARDED_PROTO}" pattern="^http$" ignoreCase="false" />
</conditions>
<action type="Redirect" redirectType="Found" url="https://{SERVER_NAME}{URL}" />
</rule>
</rules>
</rewrite>

続きを読む こちら

15
Iman Sedighi

探しているソリューションではないかもしれませんが、ELBに加えてAWS CloudFrontを使用することもできます。 CloudFrontは、すべての着信HTTPトラフィックをHTTPSにリダイレクトするオプションを提供します。

4
MojoJojo

上記のhtaccessソリューションにより、ELBヘルスチェックが失敗しました。誰かが私と同じ問題を抱えている記事をオンラインで発見するまで、解決策を見つけるのに苦労しました。彼の解決策は、代わりにこれをhtaccessファイルの先頭に追加することでした:

RewriteEngine on 
RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
RewriteRule .* https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]

ELBを介して外部リクエストをHTTPSにリダイレクトしているときに、このリクエストおよびHTTPを介した他のローカルリクエストを許可するには、httpsでの否定一致ではなくhttpで一致するように書き換え条件を調整します。

ソース: AWSおよびELBを使用したHTTPからHTTPSへのリダイレクト

3
omikes

NginxとELBの設定に奇妙な問題がありました。私のセットアップには、ELBの背後にある1つのnginx内に3つの異なるサービスが含まれていました。そして、私は混合コンテンツの問題がありました:ELBへのリクエストがhttpsであるが、ELB内部でhttpのみであり、サーバーがhttpを使用して静的への相対パスを作成すると、ブラウザーが「混合コンテンツ」の問題で失敗します。そして、リダイレクトなしでhttp/httpsの両方の動作のためのソリューションを作成する必要があります。

nginx/conf.d/フォルダーにある構成は次のとおりです。

# Required for http/https switching
map $http_x_forwarded_port $switch {
  default   off;
  "80"    off;
  "443"   on;
}

これは、実際のクライアントプロトコルが何であるかを知ることを意味します。ご覧のとおり、$switch varにあります。現時点では、必要なすべての場所でこれを使用します。

location ~ /softwareapi/index.php {
  fastcgi_param HTTPS $switch;
  .. other settings here ..
}

HTTPS設定により、phpアプリケーションは自動的に正しいプロトコルを検出し、混合コンテンツの問題を防ぐための相対パスを慎重に構築します。

宜しくお願いします。

3

@Ulliの回答に基づくTerraformを使用して構成する場合、以下に例を示します>

resource "aws_alb_listener" "web" {
  load_balancer_arn = "${aws_alb.web.arn}"

  port              = "80"
  protocol          = "HTTP"

  default_action {
    type = "redirect"

    redirect {
      port        = "443"
      protocol    = "HTTPS"
      status_code = "HTTP_301"
    }
  }
}

ソース

1
user4912329