Motomichi Works Blog

その日学習したことについて書いている日記です。誰かの役に立ったらそれはそれで嬉しいです。

さくらのレンタルサーバスタンダードとcakephpで開発その0006 Controllerを認識していないようなので、.htaccessを設置して解消する

参考にさせて頂いたページ

CakePHPをさくらインターネットのサブドメインを使用する環境へインストールする | Wataame Frog

URLリライティング — CakePHP Cookbook 2.x ドキュメント

今回起こった問題

DocumentRootで指定したページにアクセスすると、home.ctpの内容が表示されるけど、

  • Controller/MembersController.php
  • View/Index.ctp

を作成したときに例えば

http://example.com/members/index

にアクセスしても、

Not Found

The requested URL /Members/accept was not found on this server.
Apache/2.2.15 (CentOS) Server at utility.localhost.uh-oh Port 80

と表示されてしまうため、これを解決したい。

解決策の概要

.htaccessを3つ適切なディレクトリに配置することで、解消できる。

例となるディレクトリ構造

例として以下のような構造になっているものとする。
あえて公開ディレクトリにも、非公開ディレクトリにもhogeディレクトリを間に挟んで、参考ページよりも一階層深い構造の例を挙げてみる。

.htaccessにそれぞれ記述する内容

参考ページを見ながら進めてみる。

/home/ユーザ名/hoge/cakephp/.htaccess

仮にhogeディレクトリを間に挟んだとすると、以下のような記述になった。
RewriteBase,RewriteRule,RewriteRuleと三行は自分の環境に合わせてパスを変更する。

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteBase /cakephp/app
  RewriteRule ^$ /www/hoge/webroot/ [L]
  RewriteRule (.*) /www/hoge/webroot/$1 [L]
</IfModule>

/home/ユーザ名/hoge/cakephp/app/.htaccess

仮にhogeディレクトリを間に挟んだとすると、以下のような記述になった。
RewriteBase,RewriteRule,RewriteRuleと三行は自分の環境に合わせてパスを変更する。
cakephpディレクトリに配置したものと、cakephp/appディレクトリに配置したものの記述内容は同じ。

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteBase /cakephp/app
  RewriteRule ^$ /www/hoge/webroot/ [L]
  RewriteRule (.*) /www/hoge/webroot/$1 [L]
</IfModule>

/home/ユーザ名/www/hoge/webroot/.htaccess

これはhogeディレクトリを挟んだとしても、参考ページそのままに以下のように記述して配置した。

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

さくらのレンタルサーバに限った問題では無かった

公式の「応用インストール」から遷移した、「URLリライティング」のページに書いてあった。

URLリライティング — CakePHP Cookbook 2.x ドキュメント

nginxでの方法も書いてあるみたい。

とはいえ参考にさせて頂いたページはわかりやすくて助かった。