概要
AWSでELBにSSL証明書を設定してSSL接続のWordPressの運用をする際にリダイレクトループしてしまう問題とその対応方法について解説します。
ネットワーク構成
この記事では、ELB(ALB)にACMで取得したSSL証明書、または外部で取得したSSL証明書が設定されていることを想定しています。
ELB -> EC2間はHTTP通信として設定することが一般的です。
リダイレクトループが発生する問題
このような構成で導入・設定を進めた場合、リダイレクトループが発生してしまう可能性があります。発生原因と対応方法をパターン別に解説していきます。
.htaccessの問題
原因
Webサーバーが通信を処理する際、Webサーバーは非SSLでの通信を受けることになります。.htaccessに下記のような記載がある場合、リダイレクトループが発生してしまう可能性があります。
(NG記載)
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
対応方法
%{HTTP:X-Forwarded-Proto}で判断させることで、クライアントがELB宛にhttpで接続しているかhttpsで接続しているかを区別することができます。
(推奨の記載)
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
※プラグインの影響等でどうしてもhttpでの読み込みが発生してしまう場合、下記記述を.htaccessに追記することで解消する可能性があります。(2018年2月現在、Internet Explorer, Edgeは非対応です)
Header set Content-Security-Policy: upgrade-insecure-requests
WordPressがhttpsにリダイレクトさせようとしてしまう問題
原因
SSL化したWordPressを表示する際、WordPressのプログラムがhttpで通信を受けたと勘違いして、css等の読み込みをhttpで実施しようとしてしまう可能性があります。トップページをhttps、css等をhttpで読み込んでも、ブラウザでエラーが出ることがあります。
対応方法
(2019年2月25日現在)デフォルトでは、WordPressにはクライアントがELB宛の接続をhttpsで行っているかどうかをチェックする仕組みがありません。クライアントがhttpsでアクセスしているかどうかをPHP側でもチェックさせて、httpsであれば環境変数にもhttpsで接続されている旨を入れてしまいます。
(wp-config.phpの上部に下記を記載)
<?php
if($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
$_SERVER['HTTPS'] = 'on';
$_ENV['HTTPS'] = 'on';
}