Geeklog

nginx+php-fpmでGeeklogを動かす方法

投稿者: 閲覧数25,188

この文章はapache2+fcgidの環境で動いているGeeklog1.7のサイトをnginx+php-fpmの環境へ移行した際の調査を元に記事を書いてます。

最新のGeeklog2.0では違うかもしれません。

バージョン

nginx 1.1.19
php5-fpm 5.3.10
Geeklog 1.7.1sr1

※nginx[えんじんえっくす]と読むようです。

セッショントークンが毎回切れて保存できない

コンフィギュレーションの保存や記事の作成などなにか保存をする作業において毎回セッションが切れてますと出てログインIDとパスワードの入力を求められ、正しく入力しても内容が保存されていない問題が発生しました。

これは、「 /private/system/lib-security.php の1196行目にある「SECINT_checkToken()関数」内部にて$_SERVER['HTTP_REFERER']にはドメイン名まで入っているのにチェックしている$tokendata['urlfor']にはCOM_getCurrentURLの値が入っているがたいていの場合ドメイン名を含まず入っているためトークンエラーに"必ず"なっている。」ためです。

修正方法は下記の通りです。

元の1228行目付近
        } else {
            $tokendata = DB_fetchArray($tokens);
            /* Check that:
             *  token's user is the current user.
             *  token is not expired.
             *  the http referer is the url for which the token was created.
             */
            if( $_USER['uid'] != $tokendata['owner_id'] ) {
                $return = false;
            } else if($tokendata['urlfor'] != $_SERVER['HTTP_REFERER']) {
                $return = false;
            } else if($tokendata['expired']) {
                $return = false;
            } else {
                $return = true; // Everything is AOK in only one condition...
            }
これを以下のように変更
        } else {
            $purl = parse_url($_SERVER['HTTP_REFERER']);
            $chkreferer  = $purl['path'];
            $chkreferer .= empty($purl['query']) '' : '?' . $purl['query'];
            $chkreferer .= empty($purl['fragment']) '' : '#' . $purl['fragment'];
            $tokendata = DB_fetchArray($tokens);
            /* Check that:
             *  token's user is the current user.
             *  token is not expired.
             *  the http referer is the url for which the token was created.
             */
            if( $_USER['uid'] != $tokendata['owner_id'] ) {
                $return = false;
            } else if($tokendata['urlfor'] != $chkreferer) {
                $return = false;
            } else if($tokendata['expired']) {
                $return = false;
            } else {
                $return = true; // Everything is AOK in only one condition...
            }

この修正で問題なくセッショントークンのエラーが出ずに保存されるようになりました。