2012-05-27 47 views
14

当我进入我的网站上不存在的网址需要我的404页由这routes.php文件规定:笨404页

$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页面?

+2

可能重复自定义404错误页面创建:http://stackoverflow.com/questions/8422033/codeigniter-2 -1-issue-with-show-404-and-404-override –

回答

3

如果你试过user_guide你会看到是显示以下内容:

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.

所以你需要通过控制器名作为第一个参数。第二个是启用或禁用日志记录。

11

使用_remap()函数。这允许你做一些非常强大的404错误超出通常内置的错误 - 例如

  • 不同的404消息,取决于用户是否登录!
  • 额外记录404错误 - 您现在可以看到引荐人对404的影响,从而帮助追踪错误。这包括查看它是否是机器人(例如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'; 

但在欢迎NOmy_404()功能 - 这意味着你的所有404的将通过_remap功能 - 让你实现干,有你的所有404的逻辑在一个地方。

如果您在逻辑中使用show_404()或只是redirect('my_404'),那么它取决于您。如果你使用show_404() - 那么只需要修改例外类重定向

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

@monkeymatrix - 这是否回答你的问题? – Laurence

+0

感谢您的回复。我只是赶上现在的答复,看看是否有任何符合条款的赏金:) – monkeymatrix

+0

这只适用于该方法缺少,不是如果类缺失。 – pbarney

5

要改变的,你需要修改从CI核心(system/Core/Common.php),这是不是功能更新非常实用的文件show_404行为。

取而代之的是,你可以:

  1. Redirect用户在$路线[ '404_override']指定的同一个地方controller/method

  2. 您可以创建一个自定义库,以定制处理404的,并使用它像$libInstance->show_404();

    public function show_404() { 
        set_status_header(404); 
    
        return "404 - not found"; 
    } 
    
  3. 或者使用的观点:

    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

尽管我很欣赏下面的TheShiftExchange的答案非常有用,但我喜欢这个提供了更多类似于满足下一位正在寻找解决方案的用户。我认为总的来说,我建议如下所述扩展控制器类,然后用本答案中所述的视图声明一个cutom 404函数。非常感谢大家。 – monkeymatrix

0

变化application/errors/error_404.php文件到你想要的网页所示。这是show_404()是显示文件...

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

这个函数将会使用以下错误模版来显示它的404错误消息:

application/errors/error_404.php 

函数需要传递给它的字符串是找不到的页面的文件路径。请注意,如果未找到控制器,CodeIgniter将自动显示404条消息。

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

20

这里的所有答案看起来都非常过时(至少是第2版)或者非常过分。这里有一个简单得多的和可管理的方式,其中仅包括两个步骤:

  1. 的application/config/routes.php文件修改字段404_override指向一些控制器:

    // Specify some controller of your choosing 
    $route['404_override'] = 'MyCustom404Ctrl'; 
    
  2. 在您的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'); 
        } 
    } 
    

就像提到的代码注释,可以肯定有一个在应用视图文件/视图/ 404.php你实际上有你的自定义404页面。

作为一个附注,本页中的一些答案建议您修改/ system中的内容,这是一个坏主意,因为当您更新CodeIgniter版本时,您将覆盖您的更改。我建议的解决方案不会混淆核心文件,这使得您的应用程序更加便于携带和维护,并且可以更新。

+3

简单而重要。没有必要做各种额外的powertuff ... – Pim

+0

这是正确的.. –

+1

但它不适用于'show_404();'。 –

0

你需要设置下面的应用程序代码/配置/ 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'); 
    } 
} 

然后后,您可以在名为“not_found.php”的应用程序/视图中创建您自己的设计404错误页面

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

笨带有默认的404错误页面,但是,通过使用笨的路由选项,您可以轻松地显示您的自定义404错误页面,你的用户。

要做到这一点就到你的笨项目的路由文件,并键入以下行

$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视图文件在你的笨视图文件夹,就是这样,键入任何错误的URL,现在你可以看到您的自定义404错误页面。

如果您有任何疑问,那么你可以按照这个tutorial其中有教程一步一步在笨