CakePHPでURIの形式を統一する
CakePHPのURIは、通常、コントローラ名/アクション名/パラメータという形になりますが、実際には、コントローラ名/アクション名/パラメータとコントローラ名/アクション名/パラメータ/のどちらでも同じようにアクセスできます。とても気持ち悪いので一つのURIに統一するようにしています。
CakePHPでは、どのURIでどのページにアクセスさせるかのルーティングを/app/config/routes.phpで設定できますが、上記のような末尾の/の違いまでは指定できません。そこで、どちらか一方に301リダイレクトさせる処理をAppController->beforeFilter()でするようにしています。
/ありで統一する場合は次のようにします。
- /app/app_controller.php
class AppController extends Controller { function beforeFilter() { if (isset($this->params['url']['url'])) { $uri = $this->params['url']['url']; if (substr($uri, -1) != '/') { $this->redirect($uri . '/', 301); exit; } } } }
/なしで統一する場合は次のようにします。
- /app/app_controller.php
class AppController extends Controller { function beforeFilter() { if (isset($this->params['url']['url'])) { $uri = $this->params['url']['url']; if (substr($uri, -1) == '/') { $this->redirect(preg_replace('~(.*?)/+$~', '$1', $uri), 301); exit; } } } }
注意しないといけないのは、AppController->redirect()はexitしないのでAppController->redirect()やコントローラ名->redirect()の直後では必ずexitするようにしておくということです。
コメント (4)
CMSなどのWeb系のプログラムを使っていると、なんでこんな風になっているのかと思うことがよくあります。なので、自分が作るときにはそういうところには気を付けたいなあと思ってます XD
MODxはその辺りがよく考えられていますよね。シビアな人も多い(と思う)のもしっくりきた理由かもです。TinyMCEとかのWYSIWYGエディタは、あまり詳しくない人に使ってもらう場合には便利だとは思うんですけど、そういうもので他の人が更新するサイトを作ることを考えるとぞっとします(笑
フレームワークを使うとHTMLやCSSもわけやすくなるので、これからは気に入らなくても簡単に変えられるようなWebプラグラムがどんどん増えてくるかもしれませんね 🙂
まさに知りたかった情報です。
で、早速試してみました。
私も、ちょっとした事にこだわるタイプなので・・・
/ありの方を試してみました。
でも、うまく行きませんでした。
$form->submit(“送信”) のアドレスがうまく行きません。
コントローラ名/アクション名/アクション名/パラメータ/
って感じになります。
routes.phpをいじっているのが関係しているのでしょうかね~
せっかくの情報が使えなくて残念です。グスン・・・
Form(HTML)ヘルパーやセキュリティコンポーネントのせいでしょうか?
FormヘルパーでURIを指定してやるか、HTMLを直書きすると大丈夫かもしれません。
(このときはHTMLを直書きしました。)
Formヘルパーやセキュリティコンポーネントはほとんど融通がきかないみたいなので、素直にルールに従ったほうがいいのかもしれませんね。
(ヘルパーを書き直そうにも、自分の場合はセキュリティコンポーネントがかなりの曲者であきらめました…。)
トラックバック (0)
この記事へのトラックバックはまだありません。
こんにちは。
あのねぇ。Phizeさんみたいな人が、プログラム書くと、
ぜったい不思議マークアップ撲滅できると思うわ~。。
MODxの開発に携わっている方達は、結構、その辺シビアに
考えている方だとは思うけれど、でも、管理画面とかすごいし…(笑)。。
それにTinyMCEがすごいのです。。「すごい」って言葉だけで、
たぶんPhizeさんは、わかってくださると思いますけど(笑)。
追記:不思議マークアップぐぐってみました。すでに一般語なんですね??
…笑いすぎておなか痛いです。。