CodeIgniter と mod_rewrite
2008-06-02 22:37 /
ただいまお仕事に活躍中の CodeIgniter でございますが、あのありがたいユーザーズマニュアルに幾つかコメントしておこうと思ったわけです。現状の rewrite 解説だと、ローカル環境で動かす場合や共有サーバの環境には該当しない恐れがあります。そこで、このフレームワークの簡単な解説を交えて取り上げてみましょう。
CodeIgniter は、PHP のフレームワークです。現在、EllisLab という会社が開発の陣頭指揮を執っていて、この会社は ExpressionEngine という CMS も販売しています。ベルギーのデザイナーで、Veerle’s Blog というブログが有名な Veerle Pieters さんのサイトも、ExpressionEngine を使っていますね。日本では、早くから CILab さんというサイトで CodeIgniter のユーザーガイド日本語版(現在は日本のユーザー会サイトで継続して公開されているようです)が公開されていたので、こちらを利用させてもらっていた方も多いかと思います。また、このほど日本のユーザー会が設立され、6月の初旬には大部の(予定では600ページとのこと)『CodeIgniter徹底入門』が翔泳社から出るそうです。なお洋書としては、以下の二冊があります(Wrox の本は発売予定です)。
はじめて CodeIgniter を導入したのは、1.5.0 が出たばかりだったので約2年半くらい前になります。ちょうど自社のシステム部でレギュレーションを立てようとしていた時に、PHP4/5 の両方で使えるフレームワークを探していて見つけました。一社が開発の中心になっているので、BlueShoes などと同じくマイナーな印象を受けたのですが、試しにガイドを読みながら組んでみると非常に手早くセットアップが完了してコードを書き始められたので、現在も引き続き利用しています。
さて、公式サイトからダウンロードしてきたら、解凍・インストールしてみましょう。例えば、僕の場合はローカルの開発環境で以下の様な場所に CodeIgniter を入れています。
D:\web\www.********.co.jp\lib
色々な案件で使う可能性があるため、開発環境では案件に利用するドメインごとにディレクトリをつくっています。したがって、”www.*******.co.jp” というサイトで使う場合は、上記のようなフォルダに単独で CodeIgniter をインストールしなくてはなりません。”lib” が $system_folder となっていて、$application_folder に相当するフォルダを “app” という名前にリネームしています。ドメインが www.*******.co.jp となっているため、それ以下のディレクトリに対応するフォルダは、ドメイン直下の index.php を起点として CodeIgniter がルーティングします。したがって、コントローラは DOCROOT\lib\app\controllers に入れます。
CodeIgniter を利用する場合、ブラウザからのアクセスはどれもこれも \lib と同じ階層に置かれている index.php へアクセスしてから他のコントローラへと渡されます。つまり、上記のドメイン部分を公開サーバのドメインと見做せば、
http://www.*******.co.jp/lib/app/controllers/main.php
となるべきアクセスが、
http://www.*******.co.jp/main.php
という URL からマッピングされるように期待しているわけです。更に、main.php へのアクセスとは、CodeIgniter では、自動的に Main というクラスのインスタンスを作成し、コンストラクタである Main() メソッドを実行することに等しいため、ドメインの直下には(特別の URI ルーティングを設定していない限り)コントローラ名を記述するというスタイルになり、
http://www.*******.co.jp/main/
という URL からのマッピングになります。
ローカル環境で複数のドメインを使い分けるには
さて、ここで FAQ のネタになりそうな躓きの石は、ユーザーズ・マニュアルに書かれている CodeIgniter のルーティング解説は、複数のインストール環境には通用しないということです。例えば、あなたがローカルで Apache を動かしているとき、http://localhost/ でアクセスできるページは、外部へのリンク集だったり、他のローカルファイルへのポインタだったりするかもしれません。そのような場合、Apache の設定ファイルである httpd.conf には、
DocumentRoot “D:/web”
などと設定されているはずです。すると、ユーザーズ・マニュアルで解説されている、.htaccess によるリライト設定を導入すると、/index.php への書き換えは DocumentRoot 直下にある index.php への書き換えとなってしまい、いつまでたっても正しいルーティングが行われません。つまり、
RewriteRule ^(.*)$ /index.php?$1 [L]
というリライト設定は、http://localhost/www.*******.co.jp/index.php へのルーティングではなく、http://localhost/index.php へのルーティングになってしまうのです。
こういうときに最も簡単な方法は、案件の公開用サーバでは httpd.conf を編集できるとは限らないので、あくまでも条件つきですが、CodeIgniter の Wiki に解説されているように、httpd.conf でバーチャルホストを使うことでしょう。例えば、CodeIgniter の Wiki ではふつうにバーチャルホストを設定していますが、http://localhost:8080/ というポートを指定したアクセスのときだけ、他のフォルダを DocumentRoot とするサーバ設定が有効になるような記述をしてみましょう。すると、
Listen 8080
[ ... 中略 ... ]
<VirtualHost *:8080>
ServerName www.*******.co.jp:8080
DocumentRoot “D:/web/www.*******.co.jp/”
<Directory “D:/web/www.*******.co.jp/”>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
</Directory>
</VirtualHost>
という設定を追加して、httpd.exe を再起動すれば、http://localhost:8080/ で /www.*******.co.jp 以下をルートとするサーバ設定が有効になります。なお、CodeIgniter の側では、config.php の設定で、
$config[ 'index_page' ] = ”;
となるよう、index.php という値を取り除いてください。それから、mod_rewrite の設定は .htaccess に書いている事例をたくさん見かけますが、上記を設定したついでにリライトの記述も追加しています。こうすると、例えば main.php というコントローラを作成して Main::Main() というコンストラクタに echo ‘Run!’; などと書いておけば、
http://localhost:8080/main
によって、localhost:8080/index.php から localhost:8080/lib/app/controllers/main.php へのアクセスにルーティングされ、自動的に Main クラスのコンストラクタである Main() に書かれた echo ‘Run!’; が実行されます。
もう一つネタを書こうと思いましたが、これは会社として参加させていただいている勉強会(なのか?)のブログに書かせていただきます。


