2012-05-27 68 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其中有教程一步一步在笨