CakePHP with CloudFlare

XWSS017477_s

人気のCDNサービスであるCloudFlareを利用すると、CloudFlareがリバースプロキシのように振る舞うため、サーバーから見えるアクセス元は、CloudFlareになってしまう(サーバー名もcloudflare-nginxとなるので、動作に予想は付くだろう)。

しかし、CloudFlareからのアクセスには、環境変数が幾つか付加されており、実際のアクセス元を取得できる。

スポンサードリンク

もし、VPSなどを利用しているのであれば、CloudFlareの提供するApacheモジュールをサクッと組み込むだけで事足りるが、レンタルサーバーなどを利用している場合などは、モジュールをインストールできない事もある。

そのような場合、以下のように環境変数を書き換える事で対処できる。

CakePHP

手元にあるCakePHPで作成した既存のシステムには、リモートアドレスを取得する必要のある処理が書かれているが、(共通の処理を書くAppController以外の)プログラムを書き換えることなく、正しいアクセス元を取得して処理した。

これ以外に変更点はないから、今回サンプルを記載する部分は、正しく動作したといえるだろう。また、どこに記載するかは様々だと思うが、何らかの処理が行われる前にアクセス元を正しておきたかったので(CakePHPに組み込んだ自作のログ関係処理にも影響しそうなので)、beforeFilterから呼び出した。

まとめると、function cdnCloudFlareを書いて、beforeFilterに呼び出しのための1行を追加しただけで対応完了っ!ということになる。また、CloudFlare環境にあってもなくてもおそらく影響しないだろう記述になっているので、そのうちCloudFlareにしようかなーと思っている段階で入れてもいいし、CloudFlareやーめたっ!となっても問題ない(と思う。たぶん)。

サンプルソース

<?php

define(~

class AppController extends Controller {

    var $uses = ~~

    function cdnCloudFlareCheck (){

        if ( isset( $_SERVER[ 'HTTP_CF_CONNECTING_IP' ] ) ) {

            $_SERVER[ 'REMOTE_ADDR' ] = $_SERVER['HTTP_CF_CONNECTING_IP'];

        }
        return;
    }

    function beforeFilter(){

        $this->cdnCloudFlareCheck();
        $this->Auth->~~

※CloudFlareの提供するApacheモジュールのソースコードをチラ見すると、信頼できる(=CloudFlareが提供している)アクセス元からのものかどうかを判定する記述があるので、それを考えると、サンプルソースそのままを本番環境に投入するのはセキュリティー的にアレかもしれないので注意されたし。

WordPress

以上は、CakePHPの例だが、WordPress用のプラグインも提供されている。

WordPress用のプラグインでは、CloudFlareを制御できる機能のほか、正しいアクセス元を提供する機能もあるという。

ただし、確認した範囲では、WP-SlimStat-Exがそれらよりも速くフックするのか、正しいアクセス元 を取得できないように感じた。

それ以外の場合は、本プラグインの影響か、正しいアクセス元となっているようだった。

これは、WordPress用のプラグイン(で、確認くんのようなもの)をサクッと作って試した。

追記

phpMyFAQ

XWSS017479_s

正しい対応ではないと思われるが、/index.phpに以下を記述して様子を見ている。

if ( isset( $_SERVER[ 'HTTP_CF_CONNECTING_IP' ] ) ) {
    $_SERVER[ 'REMOTE_ADDR' ] = $_SERVER['HTTP_CF_CONNECTING_IP'];
}

404エラーレポート(PHP版)

[PHP] 404レポート(PHP版)」で作成したエラーレポートプログラムも同様の記述で対応可能(だと思う)。

404レポート(PHP版) Ver.0.09

関連記事

スポンサードリンク

Comments

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です