Php 编码点火器404第页

Php 编码点火器404第页,php,codeigniter,Php,Codeigniter,当我在我的站点上输入一个不存在的url时,它会将我带到404页面,该页面由routes.php指定: $route['404_override'] = 'page/not_found'; 因此,页面的设计与我在“page”目录的view not_found.php中所做的一样 但是,如果我使用此功能手动执行404: show_404(); 它带我进入默认的CodeIgniter 404页面,没有样式: 404 Page Not Found The page you requested wa

当我在我的站点上输入一个不存在的url时,它会将我带到404页面,该页面由routes.php指定:

$route['404_override'] = 'page/not_found';
因此,页面的设计与我在“page”目录的view not_found.php中所做的一样

但是,如果我使用此功能手动执行404:

show_404();
它带我进入默认的CodeIgniter 404页面,没有样式:

404 Page Not Found

The page you requested was not found.

如何使其转到我在routes文件中指定的同一404页面?

如果您尝试了用户指南,您将看到如下所示:

show_404('page'[,'log_error'])函数需要字符串 传递给它作为找不到的页面的文件路径。注 如果控制器被激活,CodeIgniter会自动显示404消息 没有找到

因此,需要将控制器名称作为第一个参数传递。第二个用于启用或禁用日志记录。

使用该功能。这允许您使用404错误完成一些非常强大的工作,这些错误超出了通常内置的错误,例如

  • 不同的404消息取决于用户是否登录
  • 404错误的额外日志记录-您现在可以看到引用404的人是什么,从而帮助跟踪错误。这包括查看它是否是一个机器人(比如谷歌机器人)——或者它是否是一个登录用户,是哪个用户导致了404(因此你可以联系他们以获取更多信息——或者如果他们试图猜测管理员路线或其他什么,就禁止他们)
  • 忽略某些404错误(例如iPhone用户的precomposed.png错误)
  • 如果您有特殊需要,允许某些控制器处理自己的404错误(例如,允许博客控制器重新路由到最新的博客)
让您的所有控制器扩展MY_控制器:

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设置为主控制器,设置为不存在的函数

$route['404']             = "welcome/my_404";
$route['404_override']    = 'welcome/my_404';
但是欢迎使用没有
my_404()
函数-这意味着您的所有404都将通过
\u 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');
    }
}

要更改
show_404
的行为,您需要修改CI core(
system/core/Common.php
)中的一个文件,这对于功能更新不是很实用

相反,您可以:

  • 用户到$route['404_override']中指定的同一位置
    控制器/方法

  • 您可以创建一个自定义库来处理自定义404,并像
    $libInstance->show_404()那样使用它

  • 或使用视图:

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

  • application/errors/error_404.php
    文件更改为要显示的页面。这就是
    show_404()
    正在显示的文件

    *show_404('page' [, 'log_error'])
    
    此函数将使用以下错误模板显示提供给它的404错误消息:

    application/errors/error_404.php
    
    函数希望传递给它的字符串是找不到的页面的文件路径。请注意,如果找不到控制器,CodeIgniter会自动显示404消息


    CodeIgniter会自动记录任何
    show_404()
    调用。将可选的第二个参数设置为
    FALSE
    将跳过日志记录。*

    这里的所有答案似乎都非常过时(至少从第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页面


    作为旁注,本页中的一些答案建议您修改/system中的内容,这是一个坏主意,因为当您更新CodeIgniter版本时,您将覆盖您的更改。我建议的解决方案不会弄乱核心文件,这使您的应用程序更加可移植、可维护,并且不易更新。

    您需要在application/config/routes.php中设置以下代码

    $route['404_override'] = 'page/not_found';
    
    在应用程序/控制器中创建一个名为“page.php”的控制器后


    CodeIgniter附带默认的404错误页面,但通过使用CodeIgniter的路由选项,您可以轻松地向用户显示自定义的404错误页面

    要做到这一点,只需转到codeigniter项目的路由文件,并在下面的行中键入

    $route['404_override'] = 'error_404';
    
    此处error_404是一个控制器文件,用于在codeigniter项目中显示自定义404错误页面或任何其他类型的错误页面

    创建错误_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');
      }
    }
    
    在CodeIgniter视图文件夹中创建错误页面查看文件,就是这样,键入任何错误的url,现在您可以看到自定义的404错误页面


    如果您有任何疑问,那么您可以按照本教程逐步创建codeigniter中的自定义404错误页面

    可能重复:@monkeymatrix-这是否回答了您的问题?感谢您的回答。我现在只是想看看有没有合适的答案:)这只适用于缺少方法的情况,而不是缺少类的情况。@pbarney不-你错了。因为我们还重载了show_404异常,该异常在类不存在时被触发,所以它解决了这个问题。虽然我非常欣赏下面的Shift Exchange的答案,它非常有用,但我喜欢它提供了以下替代实现
    <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>
    
    $route['404_override'] = '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');
      }
    }