当我在我的网站上输入一个不存在的网址时,它会转到我在routes.php中指定的404页面:
$route['404_override'] = 'page/not_found';
所以页面的设计就像我在“page”目录中的not_found.php视图中所做的那样。
但是,如果我使用此功能手动强制执行404:
show_404();
它将我带到没有样式的默认CodeIgniter 404页面:
404 Page Not Found
The page you requested was not found.
如何使其转到我在路线文件中指定的相同404页面?
答案 0 :(得分:22)
这里的所有答案看起来都非常过时(至少从版本2开始)或者非常过分。这是一种更简单,更易于管理的方式,只涉及两个步骤:
在 application / config / routes.php 中修改字段 404_override 以指向某个控制器:
// Specify some controller of your choosing
$route['404_override'] = 'MyCustom404Ctrl';
在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');
}
}
与提及的代码内注释一样,请确保在 application / views / 404.php 中有一个视图文件,其中您实际拥有自定义404页面。
作为旁注,此页面中的一些答案建议您修改/ system中的内容,这是一个坏主意,因为当您更新CodeIgniter的版本时,您将覆盖您的更改。我建议的解决方案不会破坏核心文件,这使您的应用程序更具可移植性和可维护性,并且可以更新。
答案 1 :(得分:11)
使用_remap()功能。这允许你做一些非常强大的东西,除了通常内置的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';
但是欢迎中有 NO my_404()
函数 - 这意味着你的所有404都将通过_remap
函数 - 所以你实现DRY并拥有所有404逻辑一个地方。
如果您在逻辑中使用show_404()
或redirect('my_404')
,则由您决定。如果您使用show_404()
- 那么只需修改Exceptions类以重定向
class MY_Exceptions extends CI_Exceptions
{
function show_404($page = '', $log_error = TRUE)
{
redirect('my_404');
}
}
答案 2 :(得分:5)
要更改show_404
的行为,您需要修改CI核心(system/Core/Common.php
)中的文件,这对于功能更新来说不太实用。
而不是那样,你可以:
Redirect个用户到$ route ['404_override']中指定的同一个地方controller/method
。
您可以创建自定义库来处理自定义404,并像$libInstance->show_404();
public function show_404() {
set_status_header(404);
return "404 - not found";
}
或使用观点:
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;
}
答案 3 :(得分:3)
如果您尝试了user_guide,则会看到显示以下内容:
show_404('page'[,'log_error'])函数需要字符串 传递给它是未找到的页面的文件路径。注意 如果控制器是CodeIgniter自动显示404消息 没找到。
因此您需要将控制器名称作为第一个参数传递。第二个是启用或禁用日志记录。
答案 4 :(得分:1)
您需要在application / config / 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');
}
}
然后,您可以在名为&#34; not_found.php&#34;
的应用程序/视图中为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>
答案 5 :(得分:1)
CodeIgniter附带一个默认的404错误页面但是通过使用codeigniter的路由选项,您可以轻松地向您的用户显示您的自定义404错误页面。
要执行此操作,只需转到codeigniter项目的路由文件并在行下面键入
$route['404_override'] = 'error_404';
此处 error_404 是一个控制器文件,用于在您的codeigniter项目中显示自定义404错误页面或任何其他类型的错误页面。
创建 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');
}
}
在CodeIgniter视图文件夹中显示 Error_page 视图文件,输入错误的网址,现在您可以看到自定义的404错误页面。
如果您有任何疑问,那么您可以按照tutorial这一步骤教程在codeigniter中创建自定义404错误页面
答案 6 :(得分: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
将跳过记录。*