2012-05-27 44 views
14

Cuando entro en una URL inexistente en mi sitio que me lleva a la página 404 que se especifica por esto en routes.php:CodeIgniter página 404

$route['404_override'] = 'page/not_found'; 

Por lo tanto el diseño de la página es como yo lo hizo en la vista not_found.php en el directorio "página".

Sin embargo si utilizo esta función para hacer cumplir manualmente un 404:

show_404(); 

Me lleva a la CodeIgniter página 404 por defecto sin estilo:

404 Page Not Found 

The page you requested was not found. 

¿Cómo puedo hacer que se vaya a la misma página 404 que especifiqué en el archivo de rutas?

+2

Duplicar posibles: http://stackoverflow.com/questions/8422033/codeigniter-2 -1-issue-with-show-404-and-404-override –

Respuesta

3

Si ha intentado la user_guide se vería que es muestra lo siguiente:

show_404('page' [, 'log_error']) The function expects the string passed to it to be the file path to the page that isn't found. Note that CodeIgniter automatically shows 404 messages if controllers are not found.

por lo que necesita para pasar el nombre del controlador como primer parámetro. El segundo es para habilitar o deshabilitar el registro.

11

Utilice la función _remap(). Esto le permite hacer algunas cosas muy poderosas con errores 404 más allá de lo que normalmente está incorporado - como

  • ¡Diferentes mensajes 404 dependiendo de si el usuario está conectado o no!
  • Registro extra de errores 404: ahora puede ver cuál era la persona que remitió al 404, lo que ayuda a rastrear los errores. Esto incluye ver si era un bot (como el bot de Google), o si era un usuario conectado, qué usuario causó el 404 (para que pueda comunicarse con ellos para obtener más información) o prohibirlos si intentan adivinar las rutas de administrador. o algo así)
  • Ignore ciertos errores 404 (como un error precomposed.png para usuarios de iPhone).
  • permiten que ciertos controladores para manejar su propia errores 404 diferentes si usted tiene una necesidad específica (es decir, permitir que un controlador de blog para redireccionar al último blog, por ejemplo)

¿Se extenderá todos los controladores de 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'); 
     } 
    } 

Luego, en routes.php establecer sus de 404 a su controlador principal, a una función que no existe - es decir

$route['404']    = "welcome/my_404"; 
$route['404_override'] = 'welcome/my_404'; 

pero hay NOmy_404() en función de bienvenida - Esto significa que todos los de 404 pasarán a través de la función _remap - por lo que lograr SECO y toda su lógica 404 en un solo lugar.

Depende de usted si utiliza show_404() o solo redirect('my_404') en su lógica.Si utiliza show_404() - a continuación, basta con modificar la clase de excepciones para redirigir

class MY_Exceptions extends CI_Exceptions 
{ 
    function show_404($page = '', $log_error = TRUE) 
    { 
     redirect('my_404'); 
    } 
} 
+0

@monkeymatrix - ¿Responde esto a tu pregunta? – Laurence

+0

Gracias por su respuesta. Me estoy poniendo al día con las respuestas ahora para ver si alguno se ajusta a la factura de la recompensa :) – monkeymatrix

+0

Esto solo funciona en el método que falta, no si falta la clase. – pbarney

5

para cambiar el comportamiento de show_404 necesita modificar un archivo de CI núcleo (system/Core/Common.php), que no es muy práctico para actualizaciones de funciones.

En lugar de eso, usted podría:

  1. Redirect usuarios al mismo lugar controller/method como se especifica en la ruta $ [ '404_override'].

  2. Se puede crear una biblioteca personalizada para manejar 404 personalizada de y usarlo como $libInstance->show_404();

    public function show_404() { 
        set_status_header(404); 
    
        return "404 - not found"; 
    } 
    
  3. O utilizar vistas:

    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; 
    } 
    
+0

Si bien aprecio la respuesta de TheShiftExchange a continuación, que es muy útil, me gusta esta que ofrece implementaciones alternativas que son más fáciles de satisfacer el siguiente usuario que busca una solución al problema. Creo que, en general, recomendaría extender la clase de controlador como se describe a continuación, y luego declarar una función cutom 404 con vistas como se describe en esta respuesta. Muchas gracias a todos. – monkeymatrix

0

Cambio application/errors/error_404.php archivo a la página que desea mostrado. Ese es el archivo que está mostrando show_404() ...

*show_404('page' [, 'log_error']) 

Esta función se mostrará el mensaje de error 404 que se le suministra mediante la plantilla de error siguiente:

application/errors/error_404.php 

La función espera la cadena que se le pasa a ser la ruta del archivo a la página que no se encuentra. Tenga en cuenta que CodeIgniter muestra automáticamente 404 mensajes si no se encuentran los controladores.

CodeIgniter registra automáticamente cualquier llamada show_404(). Establecer el segundo parámetro opcional en FALSE omitirá el registro. *

20

Todas las respuestas aquí parecen muy desactualizadas (a partir de la versión 2, al menos) o muy exageradas. Aquí está una manera mucho más simple y manejable, que sólo implica dos pasos:

  1. En application/config/routes.php modificar el campo 404_override apuntar a un cierto controlador:

    // Specify some controller of your choosing 
    $route['404_override'] = 'MyCustom404Ctrl'; 
    
  2. Dentro del controlador especificado en su routes.php, implemente el método index() para que cargue su vista personalizada de error 404. También puede ser que desee establecer algunas cabeceras para que el navegador sabe usted está volviendo un error 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'); 
        } 
    } 
    

Al igual que el comentario en el código mencionado, estar seguro de que hay un archivo de vista en application/views/404.php donde en realidad tiene su página 404 personalizada.

Como nota al margen, algunas de las respuestas en esta página sugieren que modifiques cosas dentro/sistema, lo cual es una mala idea porque cuando actualices tu versión de CodeIgniter, anularás tus cambios.La solución que estoy sugiriendo no interfiere con los archivos core, lo que hace que su aplicación sea mucho más portátil y mantenible, y resistente a las actualizaciones.

+3

Simple y al grano. No es necesario hacer todo tipo de potencia extra ... – Pim

+0

esto es correcto ... –

+1

Pero no funciona para 'show_404();'. –

0

Es necesario establecer a continuación el código en application/config/routes.php

$route['404_override'] = 'page/not_found'; 

Después de crear un controlador de aplicación/controlador llamado "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'); 
    } 
} 

A continuación, puede crear su propio diseño de página de error 404 en application/vista denominada "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> 

O

<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> 
1

CodeIgniter viene con una página de error 404 por defecto, pero mediante el uso de la opción de enrutamiento de CodeIgniter puede mostrar fácilmente su página de error 404 personalizada al usuario.

Para hacer esto sólo tiene que ir a archivo de ruta de su proyecto CodeIgniter y escriba debajo de la línea

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

Aquí error_404 es un archivo de controlador para visualizar la página personalizada de error 404 o cualquier otro tipo de página de error en su proyecto codeigniter.

Cree el archivo error_404 y copiar el código en este archivo

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'); 
    } 
} 

Hacer Error_page archivo vista en la carpeta de vista CodeIgniter y eso es todo, escriba cualquier dirección URL incorrecta y ahora se puede ver su encargo Página de error 404

Si tiene alguna duda se puede seguir este tutorial que tiene tutorial paso a paso para crear la costumbre página de error 404 en CodeIgniter

Cuestiones relacionadas