AWS ELB + EC2構成時のWordPressのリダイレクトループの原因と対応方法

概要

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';
}
おまけ
リダイレクトの挙動をチェックするのに便利なChrome拡張を紹介します。

Redirect Path

.htaccessの設定を試行錯誤する際や既存のサイトの挙動を調べる際に便利です!