もくじ
要件
- ALBにAWS ACMにてサーバ証明書を設定、443で待ちうける
- ALB配下のWEBサーバは80番で待ちうける
- X-Forwarded-Portが443でなければ
mod_rewriteで443のhttps://www.example.netリダイレクトを行う - http://example.netにアクセスがあった場合は、https://www.example.netにリダイレクトさせたい
標準的な要件です。
動作フロー
- ユーザ(443) → ALB(443) → WEB(80)
- ユーザ(80) → ALB(80) → WEB(80) → ALB(443)
ALB(443)でないことをWEB(80)が”X-Forwarded-Port”で判定して、443でなければALB(443)にリダイレクトを行う
Apacheの設定
# vi /etc/httpd/conf.d/www.example.net.conf <VirtualHost *:80> DocumentRoot /var/www/vhosts/www.example.net/httpdocs ServerName www.example.net ServerAlias example.net ErrorLog logs/www.example.net-error.log CustomLog logs/www.example.net-access.log elb-customlog env=!nolog ## ALB対策 <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Port} !^443$ RewriteCond %{HTTP_USER_AGENT} !^ELB-HealthChecker RewriteRule ^(.*)?$ https://www.example.net$1 [R=301,L] </IfModule> <Directory "/var/www/vhosts/www.example.net/httpdocs"> # 2.2系 #AllowOverride All #Order allow,deny #Allow from all # 2.4系対策 AllowOverride All Require all granted </Directory> </VirtualHost>
※AWS公式の推奨設定
<VirtualHost *:80> ・・・ RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent] ・・・ </VirtualHost>
上記を入れるのが推奨みたいですね。
構文確認を行った上で反映を行う
# httpd -t # systemctl reload httpd
WordPressの場合はもう一手間必要
wp-config.php
※下記を追加する # AWS ELB(ALB) リダイレクトループ対策 if ( ! empty( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' ) { $_SERVER['HTTPS']='on'; }