CloudFlareのFlexible SSLでWordPressがぶっ壊れた??

2016-08-28

こんにちは、こんばんは、おはようございます。
どうも、ロクロクです。

今回のテーマはこれ!
CloudFlareのFlexible SSLでWordPressがぶっ壊れた??

気になるよね??

それでは、チェケラ!

 

CloudFlareのFlexible SSLってなんだ?

CDNサービスであるCloudFlareの無償プランの機能の一つにFlexible SSLというのがあります。

これは図の通り、自分のWebサーバにSSLが入っていなくても、httpsのアクセスに限りCloudFlare側が勝手に証明書を提供してくれるというものです。

http://takahashifumiki.com/wp-content/uploads/2014/08/cf_ssl_settings-1.png

 

SSL利用の本来の目的はユーザーから提供される情報の送信を保護することなので、全部SSLで保護しないと意味ないような気もしますが、とにかくブラウザ上はあの緑の鍵(iPhoneだとグレーの鍵)マークが出せるわけですね。

 

WordPressに導入してみたら。。

で、このFlexible SSLなのですが、これを利用するとWordPressのある機能が動かなくなります。

それはSSL通信が行われているか否かを判定する is_ssl という関数です。

 

この関数は$_SERVER変数を見てSSLか否かを判定しているんですが、Flexible SSLを利用している場合、CloudFlareからは通常のポート80でリクエストが飛んでくるので、常にfalseとなります。

この結果、SSLを必須とするようなプラグインや管理画面をSSLに制限する機能を使っていたりすると、リダイレクトループが発生します。

  1. CloudFlare経由でhttps://test.com/login/ にアクセス
  2. is_sslは常にfalseなので、プラグインが勘違いしてhttps://test.com/login/ にリダイレクト
  3. 無限ループ

 

対処法

ではどうすればいいかというと、CloudFlareはFlexible SSLの場合、HTTP_X_FORWARDED_PROTO というヘッダーを送ってきます。このヘッダーがhttpsとなっている場合はSSL通信ということになるので、wp-config.phpに判定式を書き、SSLかどうかを設定してあげます。

1
2
3
4
5
// CloudFlareのSSL対応
if( isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && 'https'== $_SERVER['HTTP_X_FORWARDED_PROTO'] ){
        $_SERVER['HTTPS'] = 1;
        $_SERVER['SERVER_PORT'] = 443;
}

こういったグローバル変数を書き換える処理はあまり好ましくないのですが、取り急ぎこれで is_ssl は正しく動くようになります。

 

以上、焦ったけどなんとか解決した件でしたーーー。。

アディオーーーース