CodeIgniter 2.1与show_404()和404_override有关

时间:2011-12-07 20:26:20

标签: codeigniter http-status-code-404 codeigniter-2 php

我已经使用 CodeIgniter 了很长一段时间了,我现在正在为一个想要自定义 404 页面的客户做一个项目。一切都很好,404_override效果很好。

我的问题出现在访问者试图访问不存在的文章时我想调用show_404()函数,但这会显示"out of box" 404页面而不是写入的页面404_override。

我已经看到了旧版本的一些修复,但我无法在 2.1 中使用它。所以,如果有人能帮助我,我将非常感激。

4 个答案:

答案 0 :(得分:23)

重定向最干净;加载视图也可以。

这里的问题是show_404()通常在您的控制器已经加载之后被调用(事情必须告诉它显示404)。 CI不喜欢在那时加载第二个控制器,这是主要障碍。

您最好的选择可能是扩展Exceptions类中的show_404()函数以重定向到您的404路由。如果没有重定向,您将会在调用404之前显示一个您知道具有所需“额外数据”的视图或其他内容(或者我猜您也可以在Exceptions类中加载它)。在某些动态视图中,它会变得非常复杂。

你显然想要比在错误文件夹中编辑404模板更先进的东西。我在尝试从该文件访问get_instance()时遇到问题,因为有时它会在构造控制器之前加载。所以,如果你尝试那就要小心;)

更新:以下是扩展show_404()函数以加载视图的工作示例

<?php
// application/core/MY_Exceptions.php
class MY_Exceptions extends CI_Exceptions {

    public function show_404()
    {
        $CI =& get_instance();
        $CI->load->view('my_notfound_view');
        echo $CI->output->get_output();
        exit;
    }
}

答案 1 :(得分:2)

我解决问题的快速方法是在我正在进行的项目中的自动加载的帮助文件中创建一个函数。此帮助程序只是重定向到自定义404页面。我只需拨打show_my_404()而不是show_404()

function show_my_404(){   
    //Using 'location' not work well on some windows systems
    redirect('controller/page404', 'location');  
}

答案 2 :(得分:0)

  function show_404($page = '', $log_error = TRUE)
{
    if ($log_error)
    {
        log_message('error', '404 Page Not Found --> '.$page);
    }
    redirect(base_url().index_page().'/controller/error_page');
           //OR
           //redirect('SOME URL');

    exit;
}

答案 3 :(得分:-1)

我正在寻找相同的东西,但是找到了很长的解决方案,比如创建自己的错误控制器和异常类,或者只是重定向到404页面(这在语义上并不好)。

所以我对CI如何在内部调用“404_override”路线进行了一些研究。这是我提出的解决方案:

// Override show_404 method
function show_404(){
    // Load Router and Core classes.
    $RTR =& load_class('Router', 'core');

    // Get class and method for 404 from routes.php
    $x = explode('/', $RTR->routes['404_override']);
    $class = $x[0];
    $method = (isset($x[1]) ? $x[1] : 'index');

    // Get current class and method for callback
    $callback_class = $RTR->fetch_class();
    $callback_method = $RTR->fetch_method();
    // Can also log here, using callback class and method.

    // Create object for callback
    $CI = new $callback_class;
    call_user_func_array(array(&$CI, $method), array_slice(array($class,$method), 2));
} // End!

system / core / CodeIgniter.php 文件中添加此功能。 这将覆盖 show_404 功能。您可以从控制器中调用它,它将调用routes.php文件中给出的“404_override”路径。