apache mod_rewrite
- 2015年 5月15日(金) 10:51 JST
- 投稿者: akira
- 表示回数 97
apacheのmod_rewriteの設定cakephpでは、各ディレクトリごとに
RewriteBase
の設定が必要?
Rewriteエンジンの関係で †
DocumentRoot?直下にCakePHP一式を配置する場合は良いが、/sample/配下のように、サブディレクトリを掘って、その下にCakePHPとスクリプト群を配置する場合は、注意が必要。
CakePHPのチュートリアルで気をつけたいこと にある通り、ApacheのRewriteルールの関係で、404エラー(File Not Found)が出て作業がちっとも進まなくなってしまう。
Apacheのhttpd.confのRewriteモジュールの設定は次のようにしている。これは、Zend Frameworkを 使うためにしている設定。(注:後日別のサーバで同じ設定でやってたら、何をやっても"400 Bad Request"が表示されるようになった。全てのコンテンツについて400エラーになるため、Cakeとは別問題。 いろいろいじってたら、どうやらこ の2行目のルールがまずかったらしい。確かに、Cakeのチュートリアル他にはどこにもこの行は書かれていないため、ZendFrameworkを使うときに入れた設定のようだ。何にしろ、この行は不要らしい)
(注:さらに調べていくと、RewriteEngine? onの行も、各サブディレクトリの.htaccessファイルに記述しているため、不要。 なので、apache構築時に--enable- rewriteをつけてれば、httpd.confの修正は不要と言うことになる。 mod_rewriteを後付けにしてる場合はLoadModule?のみ書けばいいことになる。)
RewriteEngine on RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php
これだけだと、CakePHPのチュートリアルをサブディレクトリに配置したケースでは動いてくれない。
httpd.confで、.htaccessをOverrideできるように設定しておく。オプションはちゃんと理解してから書くこと。 適当にやると、適当にやられます。
AllowOverride AuthConfig FileInfo Indexes Limit
んで、各CakePHPディレクトリの.htaccessを次のように定義。
【/sample/.htaccess】 <IfModule mod_rewrite.c> RewriteEngine on RewriteBase /sample/ RewriteRule ^$ app/webroot/ [L] RewriteRule (.*) app/webroot/$1 [L] </IfModule>
【/sample/app/.htaccess】 <IfModule mod_rewrite.c> RewriteEngine on RewriteBase /sample/app/ RewriteRule ^$ app/webroot/ [L] RewriteRule (.*) app/webroot/$1 [L] </IfModule>
【/sample/app/webroot/.htaccess】 <IfModule mod_rewrite.c> RewriteEngine on RewriteBase /sample/app/webroot/ RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] </IfModule>
これで、動くようになるです。