Codeigniter 404错误 - 如何判断它们来自何处?

Ste*_*ier 1 codeigniter http-status-code-404

例如,在我的日志中,我有许多重复的行,例如:

ERROR - 2011-07-06 09:19:01 --> 404 Page Not Found --> favicon.ico
Run Code Online (Sandbox Code Playgroud)

有没有办法让我找出谁在调用这些错误的URL?favicon只是一个例子,有一些URL例如显示出攻击的意图,而其他URL则是一遍又一遍地重复相同的错误.基本上我很想知道哪些IP可能会阻塞,以及如果他们有错误的链接会联系哪些网站(或者我应该只使用.htaccess将它们重定向到我的服务器上).

Wes*_*rch 5

如果您认为需要这样做,只需扩展Exceptions类并覆盖该show_404()函数:

// v2.x: core/MY_Exceptions.php
// v1.x: libraries/MY_Exceptions.php
class MY_Exceptions extends CI_Exceptions {

    /**
     * 404 Page Not Found Handler
     *
     * @access  private
     * @param   string
     * @return  string
     */
    function show_404($page = '', $log_error = TRUE)
    {
        $heading = "404 Page Not Found";
        $message = "The page you requested was not found.";

        // By default we log this, but allow a dev to skip it
        if ($log_error)
        {
            // Custom code here, maybe logging some $_SERVER variables 
            // $_SERVER['HTTP_REFERER'] or $_SERVER['REMOTE_ADDR'] perhaps                 
            // Just add whatever you want to the log message

            log_message('error', '404 Page Not Found --> '.$page);
        }

        echo $this->show_error($heading, $message, 'error_404', 404);
        exit;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你继续得到类似的东西favicon.ico,这很有可能这是你的错,所以你可能想要研究一下.

只是为了澄清:

  • $_SERVER['HTTP_REFERER']会给您请求的页面的URL ,所以你可以看到该请求来自于哪里,无论是在您的网站或其他地方.
  • $_SERVER['REMOTE_ADDR'] 应该给你提出请求的IP地址

http://php.net/manual/en/reserved.variables.server.php

简要示例:

    if ($log_error)
    {
        $msg = '';
        if (isset($_SERVER['HTTP_REFERER']))
        {
            $msg .= 'Referer was '.$_SERVER['HTTP_REFERER'];            
        }
        else
        {
            $msg .= 'Referer was not set or empty';  
        }
        if (isset($_SERVER['REMOTE_ADDR']))
        {
            $msg .= 'IP address was '.$_SERVER['REMOTE_ADDR'];           
        }
        else
        {
            $msg .= 'Unable to track IP';  
        }
        log_message('error', '404 Page Not Found --> '.$page.' - '.$msg);
    }
Run Code Online (Sandbox Code Playgroud)