CodeIgniterでURIの形式を統一する

CodeIgniterでアプリケーションを制作するついでに、自分がよく使いそうなものをメモしていきます。まずは、「CakePHPでURIの形式を統一する」と同じようにURIの統一からです。

結果としては、色々と試したものの上手くいかなかったので、.htacessでリダイレクトするようにしました。CakePHPのようにすんなりいくかと思ったら、苦戦しました。

まず、CakePHPと同じような方法で行おうと思ったのですが、CodeIgniterにはCakePHPのようなAppControllerクラスがありません。コントローラで共通の処理をどこに書けばいいのか悩みました。管理ページ用にログインのチェック処理などもしたいので、どこかに共通の処理をまとめておきたいです。

CodeIgniter徹底入門」を見てみると、コアクラスを拡張する方法が使えそうなのでControllerクラスの派生クラスを作ることにしました。

/system/application/libraries/MY_Controller.php
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class MY_Controller extends Controller {
    function MY_Controller()
    {
        parent::Controller();
    }
}
?>

ここにURI統一のためのリダイレクト処理を付け加えてみました。

/system/application/libraries/MY_Controller.php
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class MY_Controller extends Controller {
    function MY_Controller()
    {
        parent::Controller();

        $this->load->helper(array('url'));
    }

    function _remap($method)
    {
        $uri = $this->uri->uri_string();

        if ($uri != '' && substr($uri, -1) != '/') {
            redirect($uri . '/', 'location', 301);
            exit;
        }
    }
}
?>

_remap()メソッドとURLヘルパーでリダイレクトさせようと思ったのですが、うまくいきませんでした。無限リダイレクトになってしまいました :(

uri_string()メソッドだか、URLヘルパーが使っているCI_Configクラスのsite_url()メソッドだかがスラッシュを除去しているようで、コアクラスを書き換える(派生クラスを作る)のも面倒なのであきらめました。それにしても、リダイレクトするためにコントローラでヘルパーを使うのに違和感が…。

結局、.htaccessが使えるサーバなので、次のように書いた.htaccessを置くことでスラッシュ付きのURIに統一できました。

.htaccess
RewriteEngine on
RewriteBase /

# index.php, index.php/ -> ルートディレクトリ
RewriteRule ^index\.php/?$ / [R=301,L]

# スラッシュ無し -> スラッシュ付き
RewriteRule ^(.+[^/])$ $1/ [R=301,L]

# /コントローラ名/... -> index.php/コントローラ名/.../
RewriteCond $1 !^(index\.php|css|user_guide|.+\.gif$|.+\.jpg$|.+\.png$|.+\.js$)
RewriteRule ^(.+)$ index.php/$1/ [L]

ついでに、index.phpでのアクセスの一部についても統一しています。「index.php」や「index.php/」はルートディレクトリに、末尾のスラッシュ無しはスラッシュ付きのURIにリダイレクトするようにしました。ただし、「index.php/コントローラ名/」などではそのままアクセスできてしまいます。気持ち悪いのですが、.htaccessだけでは無理そうなのでそのままにすることにしました。

今のところ、URIやヘルパー周りはCakePHPの方がしっくりくる印象です。

redirect()関数はスラッシュ無しのURIへリダイレクトすることがあり、このままではredirect()関数を使うたびに、redirect()関数→RewriteRuleと二重にリダイレクトが発生することがあります。そこで、URLサフィックスにスラッシュを追加しておきました。

/system/application/config/config.php
$config['url_suffix'] = "/";

これで、無駄なリダイレクトも発生せず、おおよそは思い通りになりました。

コメント (2)

  • kino
  • 2008-07-04 14:50

木下です。

おぉ、Phizeさんも CIやってるのか・・・

そういえば先日も記事にかかれてましたね。(^^;

はい。
ちょうど作りたいものがあったので、CIで作ろうかと思ってます(笑
本に名前、ばっちり載ってましたね :)

コメントフォーム

トラックバック (2)

CakePHP / mod_rewriteでスラッシュ補完

SEOを考慮したmod_rewriteの設定。
以下の動きになるようにしたかったんです。

—?
http://xxxxx/abc
http://xxxxx/abc/

http://xxxxx/abc.html
?→ http://xxxxx/abc/
?
http://xxxxx/abc/index/
http://xxxxx

CodeIgniterでログインのための共通コントローラーの作り方

人気ブログランキングへ CodeIgniter徹底入門河合 勝彦, 鈴木 憲治, 安藤 建一 コードに火をつけよう! CodeIgniter!!!!!!!!! マスタカは、CakePHPしか使ったことがありませんでしたが…

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