_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 ロジックを 1 つの場所に配置します。
show_404()
またはredirect('my_404')
ロジックで使用するかどうかはあなた次第です。使用する場合show_404()
- 例外クラスを変更してリダイレクトするだけです
class MY_Exceptions extends CI_Exceptions
{
function show_404($page = '', $log_error = TRUE)
{
redirect('my_404');
}
}