ロードバランサがある場合のWordPressのSSL設定について

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だけではなく、同じようなリダイレクトリープ状態になった時には一度、設定して見ましょう。

もし、設定した上で動作を確認し問題なく動くのであれば、どの様に設定するのが良いかを検討してみてください。

関連する記事