
WordPressめー!の、なのまるです!
WordPressで構築したサイトを、SSLオフロード機能を使って負荷分散しようとしたときにハマったのでメモです。
もくじ
SSLの処理を別サーバーにすると『is_ssl関数』が効かない!
WordPressには、HTTPSのアクセスかどうか?を判定する「is_ssl関数」が用意されています。wp-includes/functions.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /** * 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』を書き換えろと!?1 2 3 4 5 6 7 8 9 10 11 | --- 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
1 2 | 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であれば、アップデート時に上書きされてしまうことがありません!
- それにしても、こんなの面倒だなーって思いました!