当我在我的网站上输入一个不存在的URL时,它会将我带到routes.php中指定的404页面:
$route['404_override'] = 'page/not_found';
Run Code Online (Sandbox Code Playgroud)
因此,页面的设计就像我在"page"目录中的not_found.php视图中所做的那样.
但是,如果我使用此函数手动强制执行404:
show_404();
Run Code Online (Sandbox Code Playgroud)
它带我到没有样式的默认CodeIgniter 404页面:
404 Page Not Found
The page you requested was not found.
Run Code Online (Sandbox Code Playgroud)
如何使其转到我在路由文件中指定的相同404页面?
rod*_*ira 22
这里的所有答案看起来都非常过时(至少在版本2中)或者非常过分.这是一种更简单,更易于管理的方式,只涉及两个步骤:
在application/config/routes.php中,修改字段404_override以指向某个控制器:
// Specify some controller of your choosing
$route['404_override'] = 'MyCustom404Ctrl';
Run Code Online (Sandbox Code Playgroud)在您指定的控制器内部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');
}
}
Run Code Online (Sandbox Code Playgroud)与提到的代码内注释一样,请确保在application/views/404.php中有一个视图文件,其中您实际拥有自定义404页面.
作为旁注,此页面中的一些答案建议您修改/ system中的内容,这是一个坏主意,因为当您更新CodeIgniter的版本时,您将覆盖您的更改.我建议的解决方案不会破坏核心文件,这使您的应用程序更加便携和可维护,并且更新耐用.
Lau*_*nce 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');
}
}
Run Code Online (Sandbox Code Playgroud)
然后routes.php将404设置为主控制器,设置为不存在的功能- 即
$route['404'] = "welcome/my_404";
$route['404_override'] = 'welcome/my_404';
Run Code Online (Sandbox Code Playgroud)
但是欢迎中没有任何 my_404()功能 - 这意味着你的所有404都将通过该_remap功能 - 所以你实现干,并将所有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');
}
}
Run Code Online (Sandbox Code Playgroud)
要更改行为,show_404您需要修改CI core(system/Core/Common.php)中的文件,这对于功能更新来说不太实用.
而不是那样,你可以:
您可以创建一个自定义库来处理自定义404并使用它 $libInstance->show_404();
public function show_404() {
set_status_header(404);
return "404 - not found";
}
Run Code Online (Sandbox Code Playgroud)或者使用视图:
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;
}
Run Code Online (Sandbox Code Playgroud)如果您尝试了 user_guide 您会看到它显示以下内容:
show_404('page' [, 'log_error']) 该函数期望传递给它的字符串是未找到的页面的文件路径。请注意,如果未找到控制器,CodeIgniter 会自动显示 404 消息。
因此,您需要将控制器名称作为第一个参数传递。第二个用于启用或禁用日志记录。