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


104

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


1
インターネットは、この問題に対する単一の完全で機能する解決策に同意できないようです。うまくいけば、あなたは私の投稿でここでいくつかの助けを得ることができます。最後に、これを思いつくためにフープを飛び越えなければなりませんでした。
ADTC 2017年

1
このansには最新のソリューションがあり、承認されたanserはありません
AsifM '22

回答:


87

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

コンソールでこれを有効にするには、次のようにします。

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

ネイティブリダイレクトリスナールール

ここで説明するように、CLIを使用しても同じことができます

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

  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構成の1つを使用してください。


1
その簡単さを知るのにとても役立ちます。しかし、これは、リンクだけでなく、何を設定するかについての詳細な情報があれば、より良い答えになります。
ジョンリース2018

1
@JohnReesはそれに応じて回答を編集しました。これが役に立てば幸い
Ulli

いいね。私はあなたをゼロにするためにあなたを賛成しました。あなたはもっと価値があります。
ジョンリース2018

2
@florianあなたはクラシックロードバランサーを使用しているようです。Application Load Balancerに切り替えてそのオプションを取得
Ulli

インスタンスにApplication Load Balancerを割り当てるにはどうすればよいですか?(instancesタブがないため)
Florian

107

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

あなたはあなたのserverconfでこれを試すことができます:

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

ELB docsを見てください。


3
この構成はどこで行いますか?
ericpeters0n 2016年

2
@ ericpeters0n回答のスニペットはnginx設定用ですが、原則はどのWebサーバーにも適用できます。
Dmitry Mukhin 16年

1
Beanstalkをpassenger-standaloneで使用している場合、nginx構成を変更する方法については、このリンクをたどってください。qiita.com/tak_nishida/items/cf30a2d373744943b943
Yeonho

3
ロードバランサーにHTTPリスナーとHTTPSリスナーがあることを確認してください。
Gavin Palmer

1
@Ronald、応答のサーバーconfによって、ELBの背後で実行されているec2インスタンス上のnginxサーバーを意味します。
Dmitry Mukhin

34

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

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

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

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


3
これは天才です。
アンディヘイデン

2
@CodyBugsteinこれはnginxの設定です(ある場合)
ティムルソ'19

@timurso何かあるなら?
CodyBugstein

@CodyBugstein(アプリケーションの前にnginxがある場合(たとえば、そうしません-ExpressJSを実行しているコンテナーに直接ルーティングされます)
timurso

nginxはどこに行くのでしょうか?ELBの内部?EC2の内部?これはElastic Beanstalkのどこかに設定されていますか?
CodyBugstein

16

Amazon Elastic Load Balancer(ELB)は、X-FORWARDED-PROTOと呼ばれるHTTPヘッダーをサポートしています。ELBを通過するすべてのHTTPS要求には、X-FORWARDED-PROTOの値が「HTTPS」と等しくなります。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

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

<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>

詳細はこちら


ヘッダーが存在しないため、インスタンスに通常のhttpトラフィックをリダイレクトさせるという問題がありました。私は条件を作ることでそれを解決します:RewriteCond %{HTTP:X-Forwarded-Proto} !(https|^$)
natronite

これにより、無限のリダイレクトが発生します。WindowsサーバーでIISを使用しています。

@ It'satrap:IISで機能しない場合は、次のURLのスクリプトを試してください:stephen.genoprime.com/2012/01/01/aws-elb-ssl-with-iis.html
Iman Sedighi

5

上記の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へのリダイレクト


「書き換え条件を調整して、httpsでの否定的な一致ではなく、httpでの一致」を修正しようとしていました。ありがとうございました!
Merricat


3

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;
}

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

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"
    }
  }
}

ソース


-2

.ebextensions/00_forward_http_to_https.config次の内容のファイルを作成します。

files: 
  /tmp/deployment/http_redirect.sh:
    mode: "000755"
    content: |
      APP_URL=`/opt/elasticbeanstalk/bin/get-config environment --output yaml | grep -oP 'APP_URL: \K([^\s)\"](?!ttp:))+'`
      sed -ie 's@$proxy_add_x_forwarded_for;@$proxy_add_x_forwarded_for;\n        if ($http_x_forwarded_proto = 'http') { return 301 https://'"$APP_URL"'$request_uri; }@' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf

container_commands:
  http_redirect:
    command: "/tmp/deployment/http_redirect.sh"

事前にAWS管理コンソールからAPP_URL環境変数を設定してください。


ELBでTCP接続のバランスをとる場合、どうすればよいですか?
2016

1
あなたの答えがどこに当てはまるのかわかりません...あなたは弾力性のある豆の茎について話しているのですが、問題はEC2内のnginxについてです。
jvarandas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.