ELBですべてのHTTPリクエストをhttpsリクエストにリダイレクトしたい。2つのEC2インスタンスがあります。サーバーにはnginxを使用しています。私は成功せずにnginx confファイルを書き直そうとしました。私はそれにいくつかのアドバイスが欲しいです。
ELBですべてのHTTPリクエストをhttpsリクエストにリダイレクトしたい。2つのEC2インスタンスがあります。サーバーにはnginxを使用しています。私は成功せずにnginx confファイルを書き直そうとしました。私はそれにいくつかのアドバイスが欲しいです。
回答:
AWS Application Load BalancersがネイティブHTTPからHTTPSへのリダイレクトをサポートするようになりました。
コンソールでこれを有効にするには、次のようにします。
ここで説明するように、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つを使用してください。
instances
タブがないため)
ELBはX-Forwarded-Proto
ヘッダーを設定します。これを使用して、元のリクエストがHTTPに対するものであったかどうかを検出し、HTTPSにリダイレクトできます。
あなたはあなたのserver
confでこれを試すことができます:
if ($http_x_forwarded_proto = 'http') {
return 301 https://yourdomain.com$request_uri;
}
ELB docsを見てください。
nginx
設定用ですが、原則はどのWebサーバーにも適用できます。
同じ問題がありました。私の状況では、HTTPSは完全にELBによって処理され、事前にソースドメインがわからなかったため、次のようなことを行いました。
server {
listen 81;
return 301 https://$host$request_uri;
}
server {
listen 80;
# regular server rules ...
}
そしてもちろん、ELB「https」をインスタンスポート80にポイントし、次に「http」ルートをインスタンスポート81にポイントします。
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>
詳細はこちら
RewriteCond %{HTTP:X-Forwarded-Proto} !(https|^$)
上記の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での一致に書き換え条件を調整します。
探しているソリューションではないかもしれませんが、ELBに加えてAWS CloudFrontを使用することもできます。CloudFrontには、すべての着信HTTPトラフィックをHTTPSにリダイレクトするオプションがあります。
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アプリケーションは正しいプロトコルを自動的に検出し、混合コンテンツの問題を防止するための相対パスを慎重に構築します。
宜しくお願いします。
@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"
}
}
}
.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環境変数を設定してください。