SSLサイトのWordPressでリダイレクトループのためログインできない

現象

wp-config.phpに以下を記述すると、強制的に管理画面をSSLにすることができる。これを有効にしたところ、リダイレクトループが発生してしまい、ログインできなくなってしまった。

1
define('FORCE_SSL_ADMIN', true);

原因

原因としては、SSL判定が正しくなかったからである。WordPress内では以下のような is_ssl() というメソッドが用意されている。
これは $_SERVER[‘HTTPS’]と $_SERVER[‘SERVER_PORT’] を見て、SSLかどうかチェックを行っている。

1
2
3
4
5
6
7
8
9
10
11
function is_ssl() {
if ( isset($_SERVER['HTTPS']) ) {
if ( 'on' == strtolower($_SERVER['HTTPS']) )
return true;
if ( '1' == $_SERVER['HTTPS'] )
return true;
} elseif ( isset($_SERVER['SERVER_PORT']) && ( '443' == $_SERVER['SERVER_PORT'] ) ) {
return true;
}
return false;
}

実はWordPressを設置した環境が、ロードバランサでSSLを受けて、サーバ側はHTTPでリクエストを受けるような構成のため、
$_SERVER[‘HTTPS’]はonにならないのである。その代わりに $_SERVER[‘HTTP_X_FORWARDED_PROTO’] で判定をする必要がある。

解決策

Administration Over SSLのリバースプロキシを使った例の「Using a Reverse Proxy」のところに解決策が載っている。
wp-config.php に以下を記載するだけ。$_SERVER[‘HTTPS’]を書き換えるってどうなんだ?と思わなくもないが。

1
2
3
define('FORCE_SSL_ADMIN', true);
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
$_SERVER['HTTPS']='on';