こんにちは。
職人見習いの高嶋です。

PHP + ZendFrameworkのコンビでシステムを構築する際の手順を数回に分けて記していきます。

第2回はZendFrameworkを導入する際に必要となるApacheのconfでのmod_rewriteを設定する方法を紹介します。

ZendFrameworkで構築されたプログラムは、下記が全リクエストを捌くフロントコントローラーの働きをします。

ドキュメントルート/index.php

その為、mod_rewriteでZendFrameworkプログラムに対するアクセスをindex.phpに向ける設定をしなくてはいけません。

ZendFrameworkのURLパスと処理されるプログラムの関係性について改めて記述しておきますが、
下記のようなディレクトリ構造体と仮定します。

┬ .zfproject.xml
├ application
│├ Bootstrap.php
│├ configs
││└ application.ini
│├ controllers
││├ IndexController.php
││├ FugaController.php
││└ ErrorController.php
│├ models
│└ views
│ ├ helpers
│ └ scripts
│  ├ [コントローラ名]
│  │├ index.phtml
│  │└ [アクション名].phtml
│  └ error
├ library
└ public
 ├ .htaccess
 └ index.php

http://hoge.jp/fuga

そして、上記にアクセスすると、public/index.phpを介してapplication/controllers/FugaController.php が実行されます。

この特性を踏まえた上でmod_rewriteでは一般的に以下のような設定が施されます。

RewriteEngine On
RewriteCond %{REQUEST_URI} !.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/.* /xxxx/public/index.php [L]

しかし、当システムが全てZendFrameworkで賄われていれば上記の設定で問題ないのですが、
ピュアPHPや他のプログラム等が共存しているパターンでは問題が出てきます。

実際私も、過去に別プログラムで作ったシステムに、今回新たにZendFrameworkを設定して新機能をZendで構築したいと思ったのですが、以下のような問題に直面しました。

http://hoge.jp/aaa/ アクセスに対して、public/aaa/index.pl が実行されたかったのですが、mod_rewriteの条件にマッチしてしまい、application/controllers/AaaController.phpを探しに行き、そのようなコントローラーは無いとのエラーが出てしまいました。

結論としては、以下の通りになります。

1. http://hoge.jp/aaa/ のような、ファイル名を省略されたアクセスの際には、DirectoryIndexで記載された拡張子に沿ってファイルを探し、あれば実行する。

2. http://hoge.jp/admin/ のように、一部ディレクトリはZendとして認識して欲しい。

それらを踏まえた結果、以下の設定方法が望ましい事が分かりました。

DirectoryIndex   index.pl index.html index.htm index.php ※環境に応じて

RewriteEngine On

# 『admin』のような特定ディレクトリ以外はZendを介さない
RewriteCond %{REQUEST_URI} !/admin/$
RewriteRule ^/.+/$ - [L]

# それ以外のスラッシュ終わりの場合はZendを介す
RewriteCond %{REQUEST_URI} !.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/.* /xxxx/public/index.php [L]

※この記事は、なかの人(piro556)が書いています。