CodeIgniterは、そのまま使うと、全ての呼び出しはindex.phpへの引数ってことになるんだけど、
CodeIgniter ユーザガイド 日本語版に書いてあるように、ApacheのRewrite設定とCodeIgniterの設定(config.php)を組み合せて、これを除去することができる。

このとき、以下のようなPHP警告メッセージが出ることがある。

A PHP Error was encountered

Severity: Warning

Message: strpos() [function.strpos]: Empty delimiter.

Filename: core/URI.php

Line Number: 160

A PHP Error was encountered

Severity: Warning

Message: strpos() [function.strpos]: Empty delimiter.

Filename: core/URI.php

Line Number: 164

以下、対処方法。

修正前。core/URI.phpの160行目あたりはこうなってる。

        /**
         * Detects the URI
         *
         * This function will detect the URI automatically and fix the query string
         * if necessary.
         *
         * @access      private
         * @return      string
         */
        private function _detect_uri()
        {
                if ( ! isset($_SERVER['REQUEST_URI']) OR ! isset($_SERVER['SCRIPT_NAME']))
                {
                        return '';
                }

                $uri = $_SERVER['REQUEST_URI'];
                if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0)
                {
                        $uri = substr($uri, strlen($_SERVER['SCRIPT_NAME']));
                }
                elseif (strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0)
                {
                        $uri = substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME'])));
                }

$_SERVER[‘SCRIPT_NAME’]をstrposしてるんだけど、何も入ってないことを想定していないっぽい。

修正後。なんか入ってた時だけstrpos&substrをやる。

        private function _detect_uri()
        {
                if ( ! isset($_SERVER['REQUEST_URI']) OR ! isset($_SERVER['SCRIPT_NAME']))
                {
                        return '';
                }

                $uri = $_SERVER['REQUEST_URI'];
                if (strlen($_SERVER['SCRIPT_NAME']))
                {
                        if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0)
                        {
                                $uri = substr($uri, strlen($_SERVER['SCRIPT_NAME']));
                        }
                        elseif (strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0)
                        {
                                $uri = substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME'])));
                        }
                }

同士はここに。


Posted in PHP.