笨&PHP - 迫使404?(Codeigniter & PHP - forcing a 404?

2019-06-28 05:06发布

在笨,你也知道,以下形式的页: /class/function/ID ,其中类是控制器名称,功能是在控制器内的方法,和ID是通过给该方法的参数。

典型的用法是(例如用于购书网站)书ID传递给函数,那么这将查询适当的书数据库。 我的问题是这样的:我是瞎搞,随机键入的ID是不存在于数据库中(URL字符串)(与正常的点击浏览这永远不会发生),我收到数据库错误,由于残留的查询我尝试使用一个不存在的ID来执行。

我已经写代码来检查是否有尝试使用ID之前返回任何行,但如果ID是不存在的,我想用户得到一个404错误页面,而不是一个空白页或东西(因为这看起来像适当的功能)。 这将需要一个真正的404页(不是简单的装载,看起来像一个404页的图),以免与搜索引擎螺丝。 好 - 所以我的问题是这样的:正常的程序逻辑流内(如上所述)如何可使用笨我强迫404错误? 谢谢。

更新 :代码点火器有一个show_404('page')的功能,但我不认为这会产生一个真正的HTTP 404错误...

Answer 1:

show_404()实际发送正确的头一个搜索引擎将其注册为一个404页(发送404种状态)。

打电话时使用的Firefox插件检查头接收show_404() 你会看到它发送正确的HTTP状态代码。

检查默认application/errors/error_404.php 。 第一行是:

<?php header("HTTP/1.1 404 Not Found"); ?>

该行设置HTTP状态为404这是所有你需要搜索引擎来阅读网页内容为404页。



Answer 2:

如果你想有一个自定义错误页,你可以做以下thing.In你的图书馆创建一个文件名MY_Exceptions与CI_Exceptions扩展它 。而再覆盖show_404()函数 。在这个功能您现在可以创建你的控制器类的一个实例使用与get_instance()function.And使用这个情况下,你可以加载自定义404错误页面。

class MY_Exceptions extends CI_Exceptions {

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

function show_404($page = ''){ // error page logic

    header("HTTP/1.1 404 Not Found");
    $heading = "404 Page Not Found";
    $message = "The page you requested was not found ";
    $CI =& get_instance();
    $CI->load->view('/*Name of you custom 404 error page.*/');

}


Answer 3:

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

以产生404个标头。



Answer 4:

只有遵循以下步骤:

第1步更新你的application / config / routes.php文件文件

$route['404_override'] = 'error/error_404';

第2步中创建文件夹的控制器离自己的控制器。 error.php

<?php
class Error extends CI_Controller
{
function error_404()
{
    $data["heading"] = "404 Page Not Found";
    $data["message"] = "The page you requested was not found ";
        $this->load->view('error',$data);
}
}
?>

第3步创建的文件夹视图前视图。 error.php

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252" />
<title><?php echo $heading;?></title>
</head>

<body>
<?php echo $message;?>
</body>
</html>


Answer 5:

是show_404()将派出一个404,但它看起来像地狱。 已经有建议在这里的几个黑客,但为什么当你可以使用内置的功能破解?

升级到CI 2.0 ,你就可以用惊人的:

$route['404_override'] = 'errors/error_404';

然后你就可以有一个大致的错误控制器,而不必担心试图加载的意见,图书馆和助手WY在CI实例太早正常工作。



Answer 6:

尝试使用此

set_status_header(404);


Answer 7:

我有同样的问题与你,我发现这个完整的解决方案在笨3.在这里,我想一步如何解决呢份额的一步。 当然,我们需要支持自定义404页,以满足SEO的要求。

  1. 显示404页不中路由模式匹配的网址
    • 添加应用程序/控制器的一个新的错误控制器以支持自定义的404页。
class ErrorController extends CI_Controller 
{
    public function __construct() 
    {
        parent::__construct();
    } 

    public function index() 
    { 
        $this->output->set_status_header('404');
        return $this->load->view('errors/error_404'); 
    } 
}
  • 添加一个新的自定义视图error_404.php应用程序/视图/错误 404页
<div>
    <p>We are so sorry. The page you requested could not be found.</p> 
</div>
  • 声明404_overide在配置/ routes.php文件
$route['404_override'] = 'ErrorController';
  1. 显示404页的匹配路由模式,但也点不存在的资源的网址。
    • 设置subclass_prefix在配置/配置
$config['subclass_prefix'] = 'MY_';
  • 定义你的自定义异常类应用/核心
class MY_Exceptions extends CI_Exceptions {

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

    function show_404($page = '', $log_error = TRUE) {
        $CI = &get_instance();
        $CI->output->set_status_header('404');
        $CI->load->view('errors/error_404');
        echo $CI->output->get_output();
        exit;
    }

}
  • 呼叫show_404()不管你想要的。 在这里,我创建了应用程序/模型和支票查询结果有我的自定义晚饭的模型类。 其他车型将延伸晚饭模型,并显示404页面,如果他们无法找到资源。
abstract class MY_Model extends CI_Model
{

    protected $table = 'table_name';

    public function __construct()
    {
        parent::__construct();
        $this->load->database();
    }

    public function find($id)
    {
        $result = $this->db->get_where($this->table, ['id' => $id]);
        $data = $result->row_object();

        if (!$data) {
            show_404();
        }

        return $data;
    }
}


Answer 8:

在应用程序/控制器的文件夹中创建控制器。

class Error extends Controller
{
function error_404()
{
    $this->load->view('error');
}
}

然后在你的应用程序/库通过创建应用程序/库/ MY_Router.php扩展路由器类

class MY_Router extends CI_Router
{
private $error_controller = 'error';
private $error_method_404 = 'error_404';

function MY_Router()
{
    parent::CI_Router();
}

// this is just the same method as in Router.php, with show_404() replaced by $this->error_404();
function _validate_request($segments)
{
    // Does the requested controller exist in the root folder?
    if(file_exists(APPPATH.'controllers/'.$segments[0].EXT))
    {
        return $segments;
    }

    // Is the controller in a sub-folder?
    if(is_dir(APPPATH.'controllers/'.$segments[0]))
    {
        // Set the directory and remove it from the segment array
        $this->set_directory($segments[0]);
        $segments = array_slice($segments, 1);
        if(count($segments) > 0)
        {
            // Does the requested controller exist in the sub-folder?
            if(!file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].EXT))
            {
                return $this->error_404();
            }
        }
        else
        {
            $this->set_class($this->default_controller);
            $this->set_method('index');
            // Does the default controller exist in the sub-folder?
            if(!file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT))
            {
                $this->directory = '';
                return array();
            }
        }
        return $segments;
    }
    // Can't find the requested controller...
    return $this->error_404();
}

function error_404()
{
    $segments = array();
    $segments[] = $this->error_controller;
    $segments[] = $this->error_method_404;
    return $segments;
}

function fetch_class()
{
    // if method doesn't exist in class, change
    // class to error and method to error_404
    $this->check_method();
    return $this->class;
}

function check_method()
{
    $class = $this->class;
    if (class_exists($class))
    {
        if ($class == 'doc')
        {
            return;
        }
        if (! in_array('_remap', array_map('strtolower', get_class_methods($class)))
            && ! in_array(strtolower($this->method), array_map('strtolower', get_class_methods($class))))
        {
            $this->class = $this->error_controller;
            $this->method = $this->error_method_404;
            include(APPPATH.'controllers/'.$this->fetch_directory().$this->error_controller.EXT);
        }
    }
}

}

如果页面不存在,它会被路由到错误控制器



文章来源: Codeigniter & PHP - forcing a 404?