2015年7月22日水曜日

[WordPress] is_ssl関数を ロードバランサ環境で対応させる


WordPressめー!の、なのまるです!

WordPressで構築したサイトを、SSLオフロード機能を使って負荷分散しようとしたときにハマったのでメモです。


もくじ



SSLの処理を別サーバーにすると『is_ssl関数』が効かない!

WordPressには、HTTPSのアクセスかどうか?を判定する「is_ssl関数」が用意されています。
wp-includes/functions.php
/**
 * Determine if SSL is used.
 *
 * @since 2.6.0
 *
 * @return bool True if SSL, false if not used.
 */
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;
}

で、判定が「Port 443」だったらHTTPS!みたいな判定なんですね。
これが、ロードバランサーなどの『SSLオフロード』配下だと、困るんです!

解決法

他のサイトでは、『wp-includes/functions.php』を書き換えろと!?
--- functions.php       2015-06-11 23:54:03.615427705 +0900
+++ functions.bad.php   2015-07-22 20:45:53.092568450 +0900
@@ -3688,6 +3688,9 @@
        } elseif ( isset($_SERVER['SERVER_PORT']) && ( '443' == $_SERVER['SERVER_PORT'] ) ) {
                return true;
        }
+       if ( isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https' ) {
+               return true;
+       }
        return false;
 }


『wp-includes/functions.php』を書き換えたら、アップデートで上書きされるから!

『wp-includes/functions.php』を書き換えると、これはCoreのファイルなので、WordPress本体をアップデートしたら上書きされてします!

じゃあ、対応方法は?
ちゃんと公式のドキュメントにありましたよ!

wp-config.php
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
    $_SERVER['HTTPS'] = 'on';

この設定で、ロードバランサの下でも「is_ssl」がちゃんと判定されます!

注意事項

リーバスプロキシ、ロードバランサ、SSLオフローダー、ELBとかそういうのでHTTPヘッダーに
「HTTP_X_FORWARDED_PROTO」を付与して、そこにscheme(https)を入れて渡してあげてね!


まとめ


  • 検索の仕方次第では、「WordPress」のコアファイルに変更をするよう書かれているものがあるので、お気をつけて!
  • wp-config.phpであれば、アップデート時に上書きされてしまうことがありません!
  • それにしても、こんなの面倒だなーって思いました!


参考

Zenback