AWSのALBや、NginxのProxyを利用し、配下のWEBサーバでWordPressを動かす場合に、ALBやNginx(Proxy)にSSL(HTTPS)設定をすると思います。
その際に、配下のWEBサーバに設置したWordPressについて、ちょっとした対応をしないと、無限ループや真っ白の画面に遭遇することになります。
概要
ALBやNginx(Proxy)側でHTTPSにて受付け、配下のWEBサーバでHTTPで受ける場合に、WordPressでHTTPSのアクセスとして受付けできず、リダイレクトループに陥ります。
対応方法
幾つか対応方法はありますが、簡単なものから取り上げていきます。
まずは、WordPressにて対応する場合の内容です。
以下は、wp-config.phpとなります。
<?php
/**
* WordPress の基本設定
*
* このファイルは、インストール時に wp-config.php 作成ウィザードが利用します。
* ウィザードを介さずにこのファイルを "wp-config.php" という名前でコピーして
* 直接編集して値を入力してもかまいません。
*
* このファイルは、以下の設定を含みます。
*
* * MySQL 設定
* * 秘密鍵
* * データベーステーブル接頭辞
* * ABSPATH
*
* @link https://ja.wordpress.org/support/article/editing-wp-config-php/
*
* @package WordPress
*/
// 注意:
// Windows の "メモ帳" でこのファイルを編集しないでください !
// 問題なく使えるテキストエディタ
// (http://wpdocs.osdn.jp/%E7%94%A8%E8%AA%9E%E9%9B%86#.E3.83.86.E3.82.AD.E3.82.B9.E3.83.88.E3.82.A8.E3.83.87.E3.82.A3.E3.82.BF 参照)
// を使用し、必ず UTF-8 の BOM なし (UTF-8N) で保存してください。
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
$_SERVER['HTTPS'] = 'on';
}
以下省略
ポイントとしては、以下の個所となります。
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
$_SERVER['HTTPS'] = 'on';
}
これにより、HTTP_X_FORWARDED_PROTOの変数を持っているアクセスの場合に、HTTPで来たアクセスもHTTPSとなります。
ただ、使う場所が変わらないのであれば、無駄なif文を外してしまってもいいかもしれません。
2つ目の方法は、配下のWEBサーバの変数として設定してしまう方法です。
Apacheの場合
SetEnvIf X-Forwarded-Proto https HTTPS=on
Nginxの場合
fastcgi_param HTTPS on;
wp-config.phpにて、設定していた$_SERVER[‘HTTPS’]の部分を、配下のサーバ側(ApacheかNginx、、、それ以外)で、先に設定しています。
こうすることで、WordPress側の設定を変更せずに設置することが可能になるので、ローカル環境と本番環境でwp-config.phpを書き換える必要がないので、ちゃんとした運用を考えると、サーバ側で設定する方がいいかもしれません。
総括
はじめてALBなどのロードバランサを使った場合に、恐らく気が付くことがないものだと思います。
他のCMSなどでも同じようなことが起こることがありますので、WordPressだけではなく、同じようなリダイレクトリープ状態になった時には一度、設定して見ましょう。
もし、設定した上で動作を確認し問題なく動くのであれば、どの様に設定するのが良いかを検討してみてください。