CodeIgniter и TeamSense: Делаем свой вид для страницы с ошибкой 404, настраиваем правильную отдачу статусов в HTTP headers

CodeIgniter и TeamSense: Делаем свой вид для страницы с ошибкой 404, настраиваем правильную отдачу статусов в HTTP headers Показываем человеку свою страницу Error 404, и для поисковой оптимизации важно, чтобы страницы отдавали правильные HTTP заголовки (страницы с ошибкой 404 не исключение).

Меня всегда досадовала ситуация со страницей ошибки 404 в CodeIgniter. Во первых, стандартная страница отпугивает меня и думаю, ещё больше людей, которые вдруг на неё попадают. Вот как она выглядит.

CodeIgniter стандартная страница ошибки Error 404 page not found, делаем свой вид для страницы с ошибкой 404 в CodeIgniter

Малоинформативна для обычного человека и не предлагает никаких альтернатив, кроме как вернуться назад или вообще закрыть сайт и забыть о его существовании. В фреймворке Yii этот момент продуман лучше, но давайте сделаем свой вид для страницы с ошибкой 404 в CodeIgniter, а также по ходу дела настроим правильную отдачу статусов в HTTP headers (очень важно для поисковых роботов).

Кстати говоря, способ, о котором я расскажу успешно работает в нашем продукте Team Sense и на сайте   Центра межкультурного общение Открытый Мир. Поэтому, те кто приобретает у нас систему Team Sense, получают и это обновление в коде.

1. Случай, когда не существует контроллер или метод.

В CodeIgniter 2.x введен новый роут – $route['404_override']. Прописываем туда путь к нашему контроллеру/методу, который приведёт на собственнцю страницу с ошибкой 404. Он должен быть сразу под default_controller и до всех ваших роутов:

$route['default_controller'] = "welcome";
$route['404_override'] = 'error/error_404';
...
Теперь надо создать свой контроллер error с методом error_404(). Вот его содержимое:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Error extends MY_Controller 
{
public function __construct()
{
parent::__construct();
}

function error_404()
{
$this->output->set_status_header('404');
//$this->load->view('404');      
$this->data['title'] = "Страница не найдена";
$this->data['content'] = '<h1>Страница не найдена.</h1> Посмотрите существующие страницы в меню, или перейдите <a href="'.base_url().'">на главную.</a>'; 
$this->render('page'); 
}
}       

?>     
set_status_header('404'); – отдает правильную ошибку для страницы 404, которая важна поисковым роботам.
Мы используем шаблон в видах, от этого – $this->render(). Обычно можно использовать и $this->load->view('файл_вида_с_ошибкой_404'). То есть можете сделать так:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Error extends MY_Controller {

function error_404()
{
$this->output->set_status_header('404');
$this->load->view('404');
}
}   
Тогда создайте вид страницы с ошибкой 404.php в папке views.
Теперь в случае несуществующего контроллера или метода, вместо стандартной страницы, у нас красиво оформленная страничка для Page not found. Посмотрите:
собственная страница ошибки Error 404 page not found для CodeIgniter

 

2. Случай, когда вызывается метод с несуществующим параметром (аргументом), нет записи с таким $id.

Как обрабатывать такой случай, стандартного понятного решения, типа 404_override, я не нашёл. Приходится в каждый метод прописывать условие на случай отсутствия в таблице строки с вызываемым аргументом. Если прописывать:
if(!$this->data['article']) show_404();
То show_404() показывает стандартную страницу, а не мою, красивую. Поэтому создаём хелпер с функцией page_not_found, которую вызываю вместо show_404. Можно покопаться в системной show_404, но это неправильно, я считаю.
function read($id) {
$this->data['article'] = $this->Articles_model->get($id);  
if(!$this->data['article']) echo page_not_found('<h1>Страница не найдена.</h1> Посмотрите существующие страницы в меню, или перейдите <a href="'.base_url().'">на главную.</a>'); 
else
{    
...
Сам хелпер создаю в папке helpers и называю error_helper.php, вот его содержимое:
<?php 
if (!defined('BASEPATH')) exit('No direct script access allowed');   

// make sure the function doesn't already exist
// You don’t want to mistakenly override an existing function
if ( ! function_exists('page_not_found'))
{
function page_not_found($var = '')
   {
       header("HTTP/1.1 404 Not Found");
return $var;
   }
}

?> 
Пожалуй, тут можно поизящнее как-то сделать, но я ещё не дошёл умом до этого. Пишите в комментариях, если вам известны другие способы и вы успешно их применяете в своих разработках. Буду рад узнать новые методы.
 
P.S. Мне помогла статья Creating Custom 404 Pages With CodeIgniter, там в начале очень хорошо рассказано что к чему.

CodeIgniter и TeamSense: Делаем свой вид для страницы с ошибкой 404, настраиваем правильную отдачу статусов в HTTP headers

 

Источник: loco.ru

almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.

Вы можете почитать все статьи от almix'а.



Другие статьи по этой теме:

Комментарии (0)     Подпишитесь на RSS комментариев к этой статье.