2025年 4月5日(土) 05:47 JST

apache mod_rewrite

  • 2015年 5月15日(金) 10:51 JST
  • 投稿者:
  • 表示回数 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>

これで、動くようになるです。