自定义 404 未在实时服务器上的 Codeigniter 中显示

Posted

技术标签:

【中文标题】自定义 404 未在实时服务器上的 Codeigniter 中显示【英文标题】:Custom 404 not showing in Codeigniter on live server 【发布时间】:2018-01-22 10:51:36 【问题描述】:

我正在开发一个 Codeigniter 项目,如果找不到路由,我想显示一个自定义 404 页面。在本地主机上一切正常,但是当我在实时服务器上上传我的项目时,它不再显示了。在实时服务器上,它向我显示默认 404。并且 url 像这样 example.com/my404 生成,但不显示我的自定义 404。请帮助我找出我遗漏的地方。感谢您的宝贵回答。

这是我的视图文件error_404.php

<!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="utf-8">
    <title>404 Page Not Found</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
    <style type="text/css">
      body
      
        padding: 0px;
        margin:0px;
      

      h1
      
        padding: 0px;
        margin: 0px;
        font-size: 15px;
        text-align: center;
        font-weight: 600;
        font-family: sans-serif;
        color: #003a99;
      

      #container
      
        width: 100%;
        background-position: top center;
        background-repeat: no-repeat;
        background-attachment: local;
        background-size: cover;
      

      .web
      
        padding-top: 10px;
        padding-bottom: 85px;
      

      span
      
        color:#333;
      

      .heading
      
        color:#333;
      
    </style>
    </head>
    <body>
        <div id="container" class="img-responsive" style="assets/images/background-image:url(404-Page-Not-Found2.jpg);">
        <img src="assets/images/404-page.png" class="img-responsive"/>
        <h1 class="heading">The page you’re looking for went fishing!</h1>
        <h1 class="web">Go back to <a href="<?php echo base_url();?>"><span>www.vpacknmove.in</span></a><h1>
        </div>
    </body>
    </html>

这是我的控制器文件 My404.php

<?php
class My404 extends CI_Controller

    public function __construct()
    
        parent::__construct();
    

    public function index()
    
        $this->output->set_status_header('404');
        $this->load->view('error_404');//loading in my template
    

?>

还有我的路线

$route['404_override'] = 'My404';
$route['default_controller']      = 'Home';

【问题讨论】:

【参考方案1】:

尝试将路由中的控制器名称小写:

$route['404_override'] = 'my404';

如果这不能解决您的问题,请报告。

关于如果需要自定义没有匹配路由时生成的404怎么办,我创建了一个文件/application/core/MY_Exception.php:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class MY_Exceptions extends CI_Exceptions 

    /**
     * Class constructor
     */
    public function __construct()
    
        parent::__construct();
    

    // --------------------------------------------------------------------

    /**
     * 404 Error Handler
     * -----------------
     * This method has been extended so that if we use the show_404
     * function, that it is a styled/custom 404 page that is shown.
     */
    public function show_404( $page = '', $log_error = TRUE )
    
        if( is_cli() )
        
            $heading = 'Not Found';
            $message = 'The controller/method pair you requested was not found.';
        
        else
        
            $heading = '404 Error - Page Not Found';
            $message = 'The page or resource you were looking for was not found on this server.';
        

        // By default we log this, but allow a dev to skip it
        if( $log_error )
        
            log_message('error', $heading . ': ' . $page );
        

        if( is_cli() )
        
            echo $this->show_error($heading, $message, 'error_404', 404);   
        
        else
        
            $CI = &get_instance();

            $CI->output->set_status_header('404');

            $view_data = [
                'heading' => $heading,
                'message' => $message
            ];

            $data = [
                'doc_title' => ['pre' => '404 Error - Page Not Found - '],
                'extra_head' => '<meta name="robots" content="noindex,nofollow" />',
                'content' => $CI->load->view( 'errors/html/error_404', $view_data, TRUE )
            ];

            $CI->load->view('templates/main', $data);

            echo $CI->output->get_output();
        

        exit(4); // EXIT_UNKNOWN_FILE
    

    // --------------------------------------------------------------------


请注意,按照我的做法,我将 error_404 视图嵌套在我创建的模板中。我就是这样做的。当您在应用程序(通常是您的控制器)中创建页面时,您将使用该部分替换该部分。

【讨论】:

感谢您的回复@BrianGottier 但它不起作用。无论如何,我将默认的 404 代码更改为我的代码。现在它正在工作。但我想知道这样做是否正确?如果在路线中找不到路线,我该怎么做才能显示 404。 我已经更新了我的答案。希望这是您要找的。​​span> 感谢@BrianGottier 的帮助......现在它工作正常 是的@BrianGottier,您的回答很有帮助。但我不能投票这个答案,因为我的声誉低于 15。无论如何,我通过你的回答学到了一些新东西。再次感谢。

以上是关于自定义 404 未在实时服务器上的 Codeigniter 中显示的主要内容,如果未能解决你的问题,请参考以下文章

TFS Api 未在 Dev Azure 上的自定义流程模板中提供自定义状态

带有主机名的主页未在实时服务器上的 Django 应用程序中打开

CodeIgniter 路由和 404 自定义错误

DJANGO:静态文件未在实时服务器中加载(但在本地加载)?

自定义用户控件的 DependencyProperty 绑定未在更改时更新

使用自定义 htaccess mod 重写时有效路由上的 Codeigniter 404