* Rewriteエンジンの関係で [#wd94b88d]

DocumentRoot直下にCakePHP一式を配置する場合は良いが、/sample/配下のように、サブディレクトリを掘って、その下にCakePHPとスクリプト群を配置する場合は、注意が必要。

[[CakePHPのチュートリアルで気をつけたいこと:http://feedtailor.jp/oishi/2007/04/cake.html]] にある通り、ApacheのRewriteルールの関係で、404エラー(File Not Found)が出て作業がちっとも進まなくなってしまう。

Apacheのhttpd.confのRewriteモジュールの設定は次のようにしている。これは、[[Zend Framework:http://framework.zend.com/]]を使うためにしている設定。(注:後日別のサーバで同じ設定でやってたら、何をやっても"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>

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


* EUCでファイルを記述するために [#t5a98e4f]

 CakePHPの各種ファイルをEUCで編集したくて、そのようにすると、ブラウザで文字化けする。

 勝手にcharset=utf-8ってmetaタグに書かれているため。

 ビューにて、

 $html->charset('EUC-JP');


って書いてあげると、charset=EUC-JPが出力されるんだけど、最初にcharset=utf-8って書かれているため、ブラウザではそっちが優先されるのか、文字化けしたまま。

 こんなHTMLソースになってる。

 <html>
  <head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  </head>
  <body>
   <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" />
   </body>
 </html>

<body>タグの中にmetaタグって入れても良いんだっけかな。


ブラウザのエンコーディング設定をEUCに変えると、ちゃんと表示される。


 リファレンスには、cake/libs配下のファイルは原則としていじらないように。って書かれているけど、cake/libs/view/helpers/html.php のcharsetメソッドをいじる。

 function charset($charset = null, $return = false) {
  if (is_null($charset)) {
    //$charset = 'utf-8';
    $charset = 'EUC-JP';
  }
  return $this->output(sprintf($this->tags['charset'], $charset), $return);
 }


 これでちゃんとEUCで表示されるようになった(HTML上のheadタグ内のcharset定義がEUC-JPに変わった)。 ビューで$html->charset()をコールするのを消してすっきり。

* EUCでファイルを記述するために2 [#la0e8eb5]

 CakePHP 1.2.x.x.では、app/config/core.phpにて、

 Configure::write('App.encoding', 'euc-jp');

としてあげればいいようだ。

* EUCでファイルを記述するために3 [#uee941c8]

 「2」に書いただけだとダメで、やっぱり「1」にあるとおり、cake/libs/view/helpers/html.phpを編集しないとダメだった。

 Bakeでアプリを作る場合、[CakePHP/Bake]にある手順で作るが、このhtml.phpを含むlibsはプロジェクトとは別のディレクトリにあって、しかもそれが参照されている。

 仕方ないので、Bakeする前に、/www直下(DocumentRootの横)にcake_1.2.x.xディレクトリを置いて、そこに一式ファイルを置いて、さらにその中にあるcake/console/cake.phpを使ってBakeした。

 まあ、こういう共通ライブラリは、こういう場所に置くのがいいんだけど、わかりにくかった。

 逆に、ここに置いて、html.phpを修正してしまえば、以後のプロジェクトについては、最初からEUCで書いて良いと言うことになるので、便利と言えば便利か。

 でも、一言言ってくれるのが親切ですね。


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS