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するようにしておくということです。

コメント (2)

  • MEGU
  • 2007-12-29 10:59

こんにちは。
あのねぇ。Phizeさんみたいな人が、プログラム書くと、
ぜったい不思議マークアップ撲滅できると思うわ~。。

MODxの開発に携わっている方達は、結構、その辺シビアに
考えている方だとは思うけれど、でも、管理画面とかすごいし…(笑)。。

それにTinyMCEがすごいのです。。「すごい」って言葉だけで、
たぶんPhizeさんは、わかってくださると思いますけど(笑)。

追記:不思議マークアップぐぐってみました。すでに一般語なんですね??
…笑いすぎておなか痛いです。。

CMSなどのWeb系のプログラムを使っていると、なんでこんな風になっているのかと思うことがよくあります。なので、自分が作るときにはそういうところには気を付けたいなあと思ってます XD

MODxはその辺りがよく考えられていますよね。シビアな人も多い(と思う)のもしっくりきた理由かもです。TinyMCEとかのWYSIWYGエディタは、あまり詳しくない人に使ってもらう場合には便利だとは思うんですけど、そういうもので他の人が更新するサイトを作ることを考えるとぞっとします(笑

フレームワークを使うとHTMLやCSSもわけやすくなるので、これからは気に入らなくても簡単に変えられるようなWebプラグラムがどんどん増えてくるかもしれませんね :)

コメントフォーム

トラックバック (0)

この記事へのトラックバックはまだありません。

この記事のトラックバックURI
http://dxd8.com/archives/4/trackback/
この記事のURI
http://dxd8.com/archives/4/