Intereting Posts

Codeigniter & PHP – форсирование 404?

В кодеигнитре, как вы знаете, страница формы: /class/function/ID , где class – имя контроллера, функция – это метод внутри контроллера, а ID – это параметр, который нужно передать этому методу.

Типичным использованием будет (например, для книжного сайта) передать идентификатор книги функции, которая затем будет запрашивать базу данных для соответствующей книги. Моя проблема заключается в следующем: я беспорядочно и беспорядочно (в строке url) набрал идентификатор, отсутствующий в базе данных (с обычной точкой и просмотром страниц, это никогда не произойдет), и я получаю ошибки базы данных из-за остаточных запросов Я пытаюсь выполнить использование несуществующего идентификатора.

Я написал код, чтобы проверить, нет ли каких-либо строк, прежде чем пытаться использовать ID, но если идентификатор отсутствует, я хотел бы, чтобы пользователь получил страницу ошибки 404, а не пустую страницу или что-то в виду (так как это похоже на надлежащая функциональность). Это должно быть истинная 404 страница (а не просто загрузка вида, похожего на страницу 404), чтобы не закручивать поисковые системы. Хорошо – так мой вопрос таков: в нормальном потоке логики программы (как описано выше), как я могу заставить ошибку 404 использовать codeigniter? Благодарю.

Обновление : у воспламенителя кода есть show_404('page') но я не думаю, что это приведет к истинной ошибке HTTP 404 …

show_404() фактически отправляет соответствующие заголовки для поисковой системы, чтобы зарегистрировать ее как страницу 404 (она отправляет статус 404).

Используйте Firefox-аддон для проверки заголовков, полученных при вызове show_404() . Вы увидите, что он отправляет правильный код состояния HTTP.

Проверьте application/errors/error_404.php по умолчанию application/errors/error_404.php . Первая строка:

 <?php header("HTTP/1.1 404 Not Found"); ?> 

Эта строка устанавливает статус HTTP как 404. Это все, что вам нужно, чтобы поисковая система читала вашу страницу как страницу 404.

Если вы хотите создать страницу с пользовательскими ошибками, вы можете сделать следующее. В ваших библиотеках создайте имя файла MY_Exceptions и расширьте его с помощью CI_Exceptions . Затем переопределите функцию show_404 (). В этой функции теперь вы можете создать экземпляр класса Controller используя функцию get_instance (). Используя этот экземпляр, вы можете загрузить свою страницу 404 Error.

 class MY_Exceptions extends CI_Exceptions { public function __construct(){ parent::__construct(); } function show_404($page = ''){ // error page logic header("HTTP/1.1 404 Not Found"); $heading = "404 Page Not Found"; $message = "The page you requested was not found "; $CI =& get_instance(); $CI->load->view('/*Name of you custom 404 error page.*/'); } 

Только следуйте этим шагам:

Шаг 1 Обновите файл приложения / config / routes.php

 $route['404_override'] = 'error/error_404'; 

Шаг 2 Создайте собственный контроллер в папке контроллеров ex. error.php

 <?php class Error extends CI_Controller { function error_404() { $data["heading"] = "404 Page Not Found"; $data["message"] = "The page you requested was not found "; $this->load->view('error',$data); } } ?> 

Шаг 3 Создайте свой просмотр в папке views ex. error.php

 <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252" /> <title><?php echo $heading;?></title> </head> <body> <?php echo $message;?> </body> </html> 
  $this->output->set_status_header('404'); 

для генерации 404 заголовков.

Да show_404 () Отправляет 404, но это похоже на ад. Здесь было предложено несколько хаков, но зачем взломать, когда вы можете использовать встроенные функции?

Перейдите на CI 2.0, и вы сможете использовать потрясающие:

 $route['404_override'] = 'errors/error_404'; 

Тогда вы можете иметь общий контроллер ошибок, не беспокоясь о том, чтобы загружать представления, библиотеки и помощники WY слишком рано в экземпляре CI для правильной работы.

попробуйте использовать это

 set_status_header(404); 

Создайте контроллер в папке приложений / контроллеров.

 class Error extends Controller { function error_404() { $this->load->view('error'); } } 

Затем в вашем приложении / библиотеке расширьте класс Router, создав приложение / библиотеки / MY_Router.php

 class MY_Router extends CI_Router { private $error_controller = 'error'; private $error_method_404 = 'error_404'; function MY_Router() { parent::CI_Router(); } // this is just the same method as in Router.php, with show_404() replaced by $this->error_404(); function _validate_request($segments) { // Does the requested controller exist in the root folder? if(file_exists(APPPATH.'controllers/'.$segments[0].EXT)) { return $segments; } // Is the controller in a sub-folder? if(is_dir(APPPATH.'controllers/'.$segments[0])) { // Set the directory and remove it from the segment array $this->set_directory($segments[0]); $segments = array_slice($segments, 1); if(count($segments) > 0) { // Does the requested controller exist in the sub-folder? if(!file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].EXT)) { return $this->error_404(); } } else { $this->set_class($this->default_controller); $this->set_method('index'); // Does the default controller exist in the sub-folder? if(!file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT)) { $this->directory = ''; return array(); } } return $segments; } // Can't find the requested controller... return $this->error_404(); } function error_404() { $segments = array(); $segments[] = $this->error_controller; $segments[] = $this->error_method_404; return $segments; } function fetch_class() { // if method doesn't exist in class, change // class to error and method to error_404 $this->check_method(); return $this->class; } function check_method() { $class = $this->class; if (class_exists($class)) { if ($class == 'doc') { return; } if (! in_array('_remap', array_map('strtolower', get_class_methods($class))) && ! in_array(strtolower($this->method), array_map('strtolower', get_class_methods($class)))) { $this->class = $this->error_controller; $this->method = $this->error_method_404; include(APPPATH.'controllers/'.$this->fetch_directory().$this->error_controller.EXT); } } } 

}

Если страница не существует, она будет перенаправлена ​​на контроллер ошибок

У меня была такая же проблема с вами, и я нашел полное решение для этого в CodeIgniter 3. Здесь я хотел бы поэтапно поработать над ее решением. Конечно, нам нужно поддерживать пользовательскую страницу 404, чтобы удовлетворить потребности SEO.

  1. Показать 404 страницы для URL-адресов, которые не соответствуют схеме в маршрутах
    • Добавьте новый контроллер ошибок в приложение / контроллеры для поддержки пользовательской страницы 404.
 class ErrorController extends CI_Controller { public function __construct() { parent::__construct(); } public function index() { $this->output->set_status_header('404'); return $this->load->view('errors/error_404'); } } 
  • Добавить новое пользовательское представление error_404.php для 404 страницы в приложении / представлениях / ошибках
 <div> <p>We are so sorry. The page you requested could not be found.</p> </div> 
  • Объявить 404_overide в config / routes.php
 $route['404_override'] = 'ErrorController'; 
  1. Показать 404 страницы для URL-адресов, которые соответствуют схеме в маршрутах, но указывают на несуществующий ресурс.
    • Установите subclass_prefix в config / config .
 $config['subclass_prefix'] = 'MY_'; 
  • Определите свой класс исключений в приложении / ядре
 class MY_Exceptions extends CI_Exceptions { public function __construct() { parent::__construct(); } function show_404($page = '', $log_error = TRUE) { $CI = &get_instance(); $CI->output->set_status_header('404'); $CI->load->view('errors/error_404'); echo $CI->output->get_output(); exit; } } 
  • Вызовите show_404 (), где хотите. Здесь я создал свой собственный класс модели ужина в приложении / моделях и проверил результаты запроса. Другие модели расширят модель ужина и покажут страницу 404, если они не смогли найти ресурс.
 abstract class MY_Model extends CI_Model { protected $table = 'table_name'; public function __construct() { parent::__construct(); $this->load->database(); } public function find($id) { $result = $this->db->get_where($this->table, ['id' => $id]); $data = $result->row_object(); if (!$data) { show_404(); } return $data; } }