使用_remap()函数。这使您可以做一些非常强大的事情,其中包含超出通常内置的 404 错误 - 例如
- 不同的 404 消息取决于用户是否登录!
- 额外记录 404 错误 - 您现在可以查看 404 的推荐人是什么,从而帮助追踪错误。这包括查看它是否是机器人(例如 Google 机器人) - 或者它是否是登录用户,哪个用户导致了 404(因此您可以联系他们以获取更多信息 - 或者如果他们试图猜测管理员路线,则禁止他们或者其他的东西)
- 忽略某些 404 错误(例如 iPhone 用户的 precomposed.png 错误)。
- 如果您有特定需要,允许某些控制器以不同的方式处理自己的 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';
但是没有欢迎 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');
}
}