CakePHPのエラー404画面を振り分ける方法
2013/05/09
PCページ、ガラケーページがあるサイトをCakePHPを利用しリニューアルする案件で、
404ページなど、エラー画面を振り分ける方法にちと悩んだので、忘備録としてポストしておきます。
例によってCakePHPのバージョンは1.3です。
PCサイトへは http://sample.jp というURLでアクセス、
管理画面には http://sample.jp/admin/admins/ でアクセス、
ガラケーサイトへは http://sample.jp/i/ でアクセスする仕様としますので
routes.php を編集などします。(その内容はまたポストしたいと思います)
プレットフォームによる 404エラー の振り分け
error404.ctp を作成
URLを削られるなどして存在しないControllerやActionへアクセスした場合に表示させる404エラーページですが、
元から用意されているテンプレは /cake/libs/view/errors/error404.ctp がその正体です。
内容を見ても単に設定したエラーメッセージを表示するだけのものなので、
他ページに沿ったデザインの404ページを作成し、 /app/views/errors/ へ設置します。
今回は、
・フロント画面用のエラーページとして、front_error.ctp、
・管理画面用のエラーページとして、デフォルトの error404.ctp を流用、
・ガラケー用のエラーページとして、mobile_error.ctp
を用意しました。
app_error.php を作成
次に、 /app 直下に app_error.php を作成し、以下のように記述。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
class AppError extends ErrorHandler { function error404( $params ) { // HTMLタイトル $this->controller->set('title_for_layout', 'ページが見つかりませんでした'); if (Configure::read('Routing.prefixes') !== FALSE && preg_match('/^\/admin\/.*/', $params['url'])) { $this->controller->layout = 'admin_default'; parent::error404($params); } elseif ( Configure::read('Routing.prefixes') !== FALSE && (preg_match('/^(|\/)i\/.*/', $params['url'])) ) { if ( preg_match('/^(|\/)i\/(.*\.php$|.*\.(htm|html)$)/', $params['url']) ) { // /i/***.php or /i/***.htm にアクセスが有った場合は、/i/indexに301リダイレクト header("HTTP/1.1 301 Moved Permanently"); header("Location: http://" . $_SERVER['HTTP_HOST'] . "/i/"); } else { $this->controller->layout = 'mobile'; $this->_outputMessage('mobile_error404'); } } else { $this->_outputMessage('front_error404'); } } } |
以下の記述で404エラーページのレイアウトを指定します
フロントの404エラーのレイアウトは、デフォルトレイアウトを利用するので、特に指定せずとも問題ありません。
// 管理画面用
$this->controller->layout = 'admin_default';
// ガラケー用
$this->controller->layout = 'mobile';
管理画面の404エラーページは、デフォルトのものを利用するので、この記述。
parent::error404($params);
ガラケー用・フロント用のエラーページの表示は、以下の記述にします。
//ガラケー用
$this->_outputMessage('mobile_error404');
//フロント用
$this->_outputMessage('front_error404');
今回、ガラケーページはあまり重要でないとのことと、URLに「?」や「/」などの特殊文字を含むとRoutingが出来ないという理由から、以前のURLにアクセスされた場合にはトップページに301リダイレクトする仕様にしてみました。
404エラーページをデザインしたいなって場合は、こちらのサイトなどから参考にしてみてはいかがでしょうか。
日本のWebサイトの404ページデザインいろいろ+α - かちびと.net
http://kachibito.net/web-design/japanese-404-design.html
[tgAmazonItemLookup asin="B009EBE0XO" related="1"]
[tgAmazonItemLookup asin="B004HAFW8Y" related="1"]