2010.08.10

Codeigniter 1.7.2のデフォルトURL構造を保ったままQuery Stringを使いたい。。。

自分でPHPログイン/テンプレートエンジンを作るのに疲れたので、ここ二日ほどCodeigniter(以下CI)を触っているのですが、スマートなMVC構造にできてとても便利。

でもURL構造に落とし穴が。

デフォルトURL構造の落とし穴

通常CIでは

http://domain.com/index.php/[Controller]/[Controller Method]/

というURL構成になって、カスタマイズすれば

http://domain.com/[Controller]/[Controller Method]/ // index.phpを抜く
http://domain.com/somedir/[Controller]/[Controller Method]/ // somedirを挟む

といったスマートなURL構成にすることも可能。
しかし!
このスマートなデフォルトURL構成では、なんとURLにクエリストリングを使えません。
すなわち

http://domain.com/[Controller]/[Controller Method]?query=parameter&another=param

といったURLはCIがうまく認識してControllerに渡してくれないために、使えません。。。
さあ困った。
デフォルトの設定からちょっと変えると

http://domain.com/index.php?c=[Controller]&m=[Method]

のようにクエリストリング自体は使えるようになるのですが、URL構造が美しくなくて困ります。

改善策

http://codeigniter.com/forums/viewthread/159382/P30/
に、パッチを公開している方がいました。
パッチはこちら

システムファイルのいくつかをこのパッチファイルに入れ替えて、application/config.phpに
$config['allow_get_array'] = TRUE;
を追加するとあら不思議。
CIのバージョンは1.7.2です。

// 今となっては以下はゴミです。

何種類かありますが、その昔一番いいと思っていたもの。

/system/libraries/URI.php
の142行目にある

$request_uri = preg_replace(“|/(.*)|”, “\\1″, str_replace(“\\”, “/”, $_SERVER['REQUEST_URI']));

を下記のように変更します。

$uri = explode(“?”,$_SERVER['REQUEST_URI']);
$request_uri = preg_replace(“|/(.*)|”, “\\1″, str_replace(“\\”, “/”, $uri[0]));

また、これをhookを使って別クラスファイルを作って実装することもできるそうなのですが、面倒そうなのでやりません。

まだフルテストしたわけではありませんので注意
早速見つけました。とりあえず$_GET[ ]が使えないようですw
ほかにもありそうですが、↓のソリューション使った方がいいかも。。。

ほかにはこのページで書かれているように、/application/config/config.phpに:

$config['uri_protocol'] = “PATH_INFO”;
$config['enable_query_strings'] = TRUE;

と設定する方法があるようです。
この場合、URLからindex.phpを抜く場合の.htaccessの記述を変えなければならないようで、そちらも要チェックです。

Leave a Reply