18

サイトに存在しない URL を入力すると、routes.php で指定されている 404 ページに移動します。

$route['404_override'] = 'page/not_found';

したがって、ページのデザインは、「ページ」ディレクトリのビュー not_found.php で作成したとおりです。

ただし、この関数を使用して手動で 404 を強制すると、次のようになります。

show_404();

スタイルのないデフォルトの CodeIgniter 404 ページに移動します。

404 Page Not Found

The page you requested was not found.

routes ファイルで指定したのと同じ 404 ページに移動するにはどうすればよいですか?

4

7 に答える 7

10

_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.php404 をメイン コントローラに、存在しない機能設定します。つまり、

$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');
    }
}
于 2012-12-22T09:36:27.583 に答える
6

の動作をshow_404変更するには、CI コア ( ) からファイルを変更する必要がありsystem/Core/Common.phpます。これは、機能の更新にはあまり実用的ではありません。

その代わりに、次のことができます。

  1. controller/method$route['404_override'] で指定されたのと同じ場所にユーザーをリダイレクトします。

  2. カスタム 404 を処理するカスタム ライブラリを作成し、次のように使用できます。$libInstance->show_404();

    public function show_404() {
        set_status_header(404);
    
        return "404 - not found";
    }
    
  3. またはビューを使用します。

    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;
    }
    
于 2012-12-22T18:06:52.697 に答える
3

user_guide を試してみると、次のように表示されます。

show_404('page' [, 'log_error']) この関数は、渡された文字列が、見つからないページへのファイル パスであると想定しています。コントローラが見つからない場合、CodeIgniter は自動的に 404 メッセージを表示することに注意してください。

そのため、コントローラー名を最初のパラメーターとして渡す必要があります。2 つ目は、ロギングを有効または無効にするためのものです。

于 2012-05-27T17:28:28.050 に答える
1

application/errors/error_404.phpファイルを表示したいページに変更します。それが表示されているファイルですshow_404()...

*show_404('page' [, 'log_error'])

この関数は、次のエラー テンプレートを使用して、指定された 404 エラー メッセージを表示します。

application/errors/error_404.php

この関数は、渡された文字列が、見つからないページへのファイル パスであると想定しています。コントローラが見つからない場合、CodeIgniter は自動的に 404 メッセージを表示することに注意してください。

CodeIgniter はすべての呼び出しを自動的にログに記録しshow_404()ます。オプションの 2 番目のパラメーターを に設定すると、FALSEロギングがスキップされます。*

于 2012-12-27T16:55:18.623 に答える