WordPressでリバースプロキシを利用するとリダイレクトループ




ローカル環境でnginxを利用して複数ドメインを開発していたときのことです。
とあるサイトのWordPressのログインページを開こうとしたのですがなぜかリダイレクトがループして開けませんでした。
いろいろ調べてわかった原因と解決方法についてまとめます。

実行していた環境について

DockerでNginxをリバースプロキシとして各サイト用に用意したコンテナ内のWebサーバーにドメインごとで割り振るようにしていました。
また、SSLについてはNginxで対応しています。

リダイレクトループしていた原因

この状態でhttps://xxx.localhost/wp-login.phpのような形でアクセスした場合、無限ループしていましたが、ヘッダー情報にHTTPSがなかったことが原因でした。
リバースプロキシなのでHTTP_X_FORWARDED_PROTOにはhttpsが設定されてました。

リダイレクトループを解除する方法

HTTP_X_FORWARDED_PROTOがヒントになりそうだったので調べたところ、WordPressの公式マニュアルに対処方法がありました。

リバースプロキシの使用
https://ja.wordpress.org/support/article/administration-over-ssl/#%e3%83%aa%e3%83%90%e3%83%bc%e3%82%b9%e3%83%97%e3%83%ad%e3%82%ad%e3%82%b7%e3%81%ae%e4%bd%bf%e7%94%a8

対処方法はwp-config.phpに以下を追加することです。

define('FORCE_SSL_ADMIN', true);
if ( ! empty( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' ) {
    $_SERVER['HTTPS']='on';
}

設定後再度アクセスすると問題なくアクセス出来るようになりました。