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>