CodeIgniter 404 страница
Когда я ввожу несуществующий URL-адрес на свой сайт, он переводит меня на страницу 404, указанную в файле route.php:
$route['404_override'] = 'page/not_found';
Итак, дизайн страницы такой, какой я сделал в представлении not_found.php в каталоге "страница".
Однако, если я использую эту функцию для ручного принудительного использования 404:
show_404();
Он переводит меня на страницу CodeIgniter 404 по умолчанию без стиля:
404 Page Not Found
The page you requested was not found.
Как я могу перейти к той же странице 404, которую я указал в файле маршрутов?
Ответы
Ответ 1
Все ответы здесь кажутся очень устаревшими (по крайней мере, с версии 2) или очень переполнены. Здесь гораздо более простой и управляемый способ, который включает только два этапа:
-
В application/config/routes.php измените поле 404_override, чтобы указать на некоторый контроллер:
// Specify some controller of your choosing
$route['404_override'] = 'MyCustom404Ctrl';
-
Внутри контроллера, указанного в вашем routes.php
, реализуйте метод index()
, чтобы он загружал ваше собственное представление об ошибке 404. Вы также можете установить некоторые заголовки, чтобы браузер знал, что вы возвращаете ошибку 404:
// Inside application/controllers/MyCustom404Ctrl.php
class MyCustom404Ctrl extends CI_Controller {
public function __construct() {
parent::__construct();
}
public function index(){
$this->output->set_status_header('404');
// Make sure you actually have some view file named 404.php
$this->load->view('404');
}
}
Как и упомянутый комментарий в коде, убедитесь, что в файле приложение /views/ 404.php есть файл вида, в котором у вас действительно есть пользовательская страница 404.
В качестве побочного примечания некоторые ответы на этой странице предлагают вам изменить содержимое внутри/системы, что является плохой идеей, потому что, когда вы обновляете свою версию CodeIgniter, вы переопределяете свои изменения. Решение, которое я предлагаю, не путается с основными файлами, что делает ваше приложение более переносимым и поддерживаемым, а также устойчивым к обновлениям.
Ответ 2
Используйте функцию _ remap(). Это позволяет вам делать очень мощные вещи с 404 ошибками за пределами того, что обычно встроено - например,
- Различные 404 сообщения зависят от входа пользователя или нет!
- Дополнительное протоколирование 404 ошибок - теперь вы можете видеть, что ссылочный пользователь был в 404, что помогает отслеживать ошибки. Это включает в себя просмотр, если это был бот (например, бот Google), или если он был зарегистрированным пользователем, какой пользователь вызвал 404 (чтобы вы могли связаться с ними для получения дополнительной информации) или запретить их, если они пытаются угадать маршруты администратора или что-то еще)
- Игнорировать некоторые ошибки 404 (например, ошибка precomposed.png для пользователей iPhone).
- Разрешить некоторым контроллерам обрабатывать свои собственные ошибки 404, если у вас есть определенная потребность (т.е. позволить блогу-контроллеру перенаправить на последний блог, например)
У вас все ваши контроллеры расширяются MY_Controller
:
class MY_Controller extends CI_Controller
{
// Remap the 404 error functions
public function _remap($method, $params = array())
{
// Check if the requested route exists
if (method_exists($this, $method))
{
// Method exists - so just continue as normal
return call_user_func_array(array($this, $method), $params);
}
//*** If you reach here you have a 404 error - do whatever you want! ***//
// Set status header to a 404 for SEO
$this->output->set_status_header('404');
// ignore 404 errors for -precomposed.png errors to save my logs and
// stop baby jesus crying
if ( ! (strpos($_SERVER['REQUEST_URI'], '-precomposed.png')))
{
// This custom 404 log error records as much information as possible
// about the 404. This gives us alot of information to help fix it in
// the future. You can change this as required for your needs
log_message('error', '404: ***METHOD: '.var_export($method, TRUE).' ***PARAMS: '.var_export($params, TRUE).' ***SERVER: '.var_export($_SERVER, TRUE).' ***SESSION: '.var_export($this->session->all_userdata(), TRUE));
}
// Check if user is logged in or not
if ($this->ion_auth->logged_in())
{
// Show 404 page for logged in users
$this->load->view('404_logged_in');
}
else
{
// Show 404 page for people not logged in
$this->load->view('404_normal');
}
}
Затем в routes.php
установите свой 404 на ваш главный контроллер, чтобы функция НЕ СУЩЕСТВУЕТ - i.e.
$route['404'] = "welcome/my_404";
$route['404_override'] = 'welcome/my_404';
но есть функция НЕТ my_404()
в приветствии - это означает, что ВСЕ ваши 404 пройдут через функцию _remap
, чтобы вы достигли СУХОЙ и имели всю свою логику 404 в одном месте.
Это зависит от вас, если вы используете show_404()
или просто redirect('my_404')
в своей логике. Если вы используете show_404()
- тогда просто измените класс Exceptions на перенаправление
class MY_Exceptions extends CI_Exceptions
{
function show_404($page = '', $log_error = TRUE)
{
redirect('my_404');
}
}
Ответ 3
Чтобы изменить поведение show_404
, вам необходимо изменить файл из ядра CI (system/Core/Common.php
), что не очень удобно для обновления функций.
Вместо этого вы можете:
-
Перенаправить пользователей на одно и то же место controller/method
, как указано в $route ['404_override'].
-
Вы можете создать пользовательскую библиотеку для обработки пользовательского 404 и использовать его как $libInstance->show_404();
public function show_404() {
set_status_header(404);
return "404 - not found";
}
-
Или используйте представления:
public function show_404($template) {
set_status_header(404);
if (ob_get_level() > $this->ob_level + 1)
{
ob_end_flush();
}
ob_start();
include(APPPATH.'views/'.$template.'.php');
$buffer = ob_get_contents();
ob_end_clean();
return $buffer;
}
Ответ 4
Если вы попробовали user_guide, вы увидите, что отображается следующее:
show_404 ('page' [, 'log_error']) Функция ожидает строку передается ему как путь к странице, которая не найдена. Заметка что CodeIgniter автоматически отображает 404 сообщения, если контроллеры не найден.
Поэтому вам нужно передать имя контроллера в качестве первого параметра. Второй - для включения или отключения ведения журнала.
Ответ 5
CodeIgniter поставляется со страницей ошибок 404 по умолчанию. Однако, используя опцию маршрутизации codeigniter, вы можете легко показать свою страницу ошибки 404 пользователю.
Чтобы сделать это, просто перейдите к файлу маршрута вашего проекта codeigniter и введите ниже строки
$route['404_override'] = 'error_404';
Здесь error_404 - файл контроллера, отображающий страницу ошибки 404 или любую другую страницу ошибок в проекте codeigniter.
Создайте файл error_404 и скопируйте этот код в этот файл
class Error_404 extends CI_controller
{
public function index()
{
$this->output->set_status_header('404');
// Make sure you actually have some view file named 404.php
$this->load->view('Error_page');
}
}
Сделайте файл Error_page в папке просмотра CodeIgniter и введите его, введите любой неправильный URL-адрес, и теперь вы можете увидеть свою страницу ошибки 404.
Если у вас есть какие-то сомнения, вы можете следовать этому учебному пособию, в котором есть пошаговое руководство по созданию пользовательской страницы ошибок 404 в codeigniter
Ответ 6
Измените application/errors/error_404.php
файл на страницу, которую вы хотите показать. Что файл, который show_404()
показывает...
*show_404('page' [, 'log_error'])
Эта функция отобразит сообщение об ошибке 404, предоставленное ему, используя следующий шаблон ошибки:
application/errors/error_404.php
Функция ожидает, что строка, переданная ей, будет файлом пути к странице, которая не найдена. Обратите внимание, что CodeIgniter автоматически показывает 404 сообщения, если контроллеры не найдены.
CodeIgniter автоматически регистрирует любые вызовы show_404()
. Установка дополнительного второго параметра на FALSE
будет пропускать ведение журнала. *
Ответ 7
Вам нужно установить код ниже в application/config/routes.php
$route['404_override'] = 'page/not_found';
После создания одного контроллера в приложении/контроллере с именем "page.php"
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class page extends CI_Controller {
public function __construct(){
parent::__construct();
}
public function not_found() {
$this->load->view('not_found');
}
}
Затем вы можете создать свой собственный проект для страницы ошибок 404 в приложении/представлении с именем "not_found.php"
<html>
<body>
<section>
<div>
<div align="center" style="margin-top:50px; margin-bottom:50px;">
<img src="<?php echo base_url();?>images/404.jpg" /> // will be your image path.
</div>
</div>
</section>
</body>
</html>
или
<html>
<body>
<section>
<div>
<div align="center" style="margin:0px auto;">
<h1>OOPS!</h1>
<h3>Sorry, an error has occured, Requested page not found!</h3>
<h5 align="center"><a href="<?php echo base_url(); ?>">Back to Home</a></h5>
</div>
</div>
</section>
</body>
</html>