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)
はい。
ちょうど作りたいものがあったので、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しか使ったことがありませんでしたが…
木下です。
おぉ、Phizeさんも CIやってるのか・・・
そういえば先日も記事にかかれてましたね。(^^;