codeigniter 404页面不存在

s71maibg  于 2022-12-06  发布在  其他
关注(0)|答案(7)|浏览(136)

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

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

因此页面的设计与我在“page”目录下的not_found.php视图中所做的一样。
但是,如果我使用此函数手动强制执行404:

show_404();

它会将我带到没有样式的默认CodeIgniter 404页面:

404 Page Not Found

The page you requested was not found.

我怎样才能让它转到我在路由文件中指定的同一个404页面?

ocebsuys

ocebsuys1#

这里所有的答案看起来都很过时(至少在第2版中是这样),或者说是矫枉过正。这里有一个更简单、更容易管理的方法,它只涉及两个步骤:
1.在application/config/routes.php中,修改字段404_override以指向某个控制器:

// Specify some controller of your choosing
$route['404_override'] = 'MyCustom404Ctrl';

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

就像代码中提到的注解一样,确保在application/views/404.php中有一个视图文件,在那里你实际上有你的自定义404页面。
顺便提一下,本页中的一些答案建议您修改/system内部的内容,这是一个坏主意,因为当您更新CodeIgniter版本时,您将覆盖您的更改。我建议的解决方案不会与核心文件混淆,这使您的应用程序更易于移植和维护,并且更不易更新。

cbwuti44

cbwuti442#

使用_remap()函数。这允许你做一些非常强大的事情,除了通常内置的404错误--比如

  • 不同的404消息取决于用户是否登录!
  • 额外记录404错误--你现在可以看到向404推荐的人是谁,从而帮助跟踪错误。这包括查看是否是bot(如Google bot)--或者是登录用户,是哪个用户导致了404(这样你就可以联系他们了解更多信息--或者如果他们试图猜测管理员路径或其他什么,就禁止他们)
  • 忽略某些404错误(例如iPhone用户的precomposed.png错误)。
  • 允许某些控制器处理自己的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设置为主控制器,设置为不存在的功能-即

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

但在welcome中有NOmy_404()函数-这意味着所有404都将通过_remap函数-因此您可以实现DRY,并将所有404逻辑集中在一个位置。
您可以在逻辑中使用show_404()或仅使用redirect('my_404')

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

j8ag8udp3#

要更改show_404的行为,您需要修改CI核心(system/Core/Common.php)中的文件,这对于功能更新来说并不实用。
您可以:

  1. Redirect个用户到$route ['404_override']中指定的相同位置controller/method
    1.您可以创建一个自定义库来处理自定义404,并像$libInstance->show_404();一样使用它
public function show_404() {
    set_status_header(404);

    return "404 - not found";
}

1.或使用视图:

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

zfciruhq4#

如果您尝试使用user_guide,您会看到它显示以下内容:
show_404('page ' [,'log_error'])此函数要求传递给它的字符串是指向未找到的页的文件路径。请注意,如果未找到控制器,CodeIgniter会自动显示404消息。
因此,您需要将控制器名称作为第一个参数传递,第二个参数用于启用或禁用日志记录。

0aydgbwb

0aydgbwb5#

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

在CodeIgniter视图文件夹中创建Error_page视图文件,就这样,键入任何错误的URL,现在您可以看到您的自定义404错误页。
如果你有任何疑问,那么你可以按照这个tutorial它有一步一步的教程来创建自定义404错误页在codeigniter

xkftehaa

xkftehaa6#

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

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

此函数将使用以下错误模板显示提供给它的404错误消息:

application/errors/error_404.php

该函数期望传递给它的字符串是未找到的页面的文件路径。请注意,如果未找到控制器,CodeIgniter会自动显示404消息。
CodeIgniter会自动记录任何show_404()调用。将可选的第二个参数设置为FALSE将跳过记录。*

k3fezbri

k3fezbri7#

您需要在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>

相关问题