任意の url で任意の controller, action を実行する方法(静的 html との共存編)

前エントリで書いた、任意の url で任意の controller, action を実行する方法で、
例外が一つある。
url と controller, action のマッピングメモ


それは、既に存在するディレクトリ名を含むマッピングができないという点である。


例えば、既に /blog ディレクトリが存在する場合、
いくら routes.php にこう書いても、 /blog/ へのアクセスで
BlogController は実行されない。

Router::connect ('/blog/:action/*', array('controller'=>'Blog', 'action'=>'index'));


これは、ドキュメントルート直下の .htaccess で以下のように記述されているためである。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>

リクエストに該当するファイルやディレクトリが無い場合に限り、
index.phpRewrite されるのだ。
/blog が既に存在する場合、 Rewrite はされない。


でもどうしてもどうしても /blog で BlogController を実行したい場合は、
/blog/index.php に、以下内容を記述すればよい。

<?php
$_GET['url'] = '/blog/';

// ドキュメントルート直下の index.php をインクルードする
require('/../index.php');
?>


因みにこのことは .htaccess の↓の行をコメントアウトしたら
実現しそうな気もするが、それは罠である。ムリ。
RewriteCond %{REQUEST_FILENAME} !-d


さらに言えば、静的 html も view ディレクトリ下に配置して、
Cakephp から(例えば pagesController)から呼び出すという方法もあるが、
全ファイルが php になってしまうので、時と場合を選ぶ。


Session を保持しつづけなければならないようなサイトでは、
その方法がよさそうだと思った。