在笨,你也知道,以下形式的页: /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的要求。
- 显示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';
- 显示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?