【问题标题】:Codeigniter 404 errors - How to tell where they're coming from?Codeigniter 404 错误 - 如何判断它们来自哪里?
【发布时间】:2023-03-09 13:20:01
【问题描述】:

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

ERROR - 2011-07-06 09:19:01 --> 404 Page Not Found --> favicon.ico

我有什么方法可以找出是谁在调用这些错误的 URL? favicon 只是一个示例,有一些 URL 例如显示黑客意图,而另一些 URL 只是一遍又一遍地重复相同的错误。基本上,我很想知道哪些 IP 可能会被阻止,以及如果它们有错误链接(或者我是否应该使用 .htaccess 将它们重定向到我的服务器上)来联系哪些网站。

【问题讨论】:

    标签: codeigniter http-status-code-404


    【解决方案1】:

    如果您觉得有必要这样做,只需扩展 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;
        }
    }
    

    如果您不断收到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);
        }
    

    【讨论】:

    • favicon 只是我目前正在解决的一个例子。还有很多其他的事情,比如尝试 /admin /mysql /images (随机的东西)和一些非常古老或奇怪的东西,这些东西重复了不止一两次。
    • 我明白了,我之前遇到过一些愚蠢的事情,比如缺少 css 背景图像会触发 404 日志,所以我想我会提到它。这个解决方案不符合您的要求吗?
    • 是的,但并没有真正解释如何获取referer。它只是说要覆盖 Exceptions 类并在那里做一些事情。
    • @StephaneGrenier:更新了答案以澄清,您需要自己将消息添加到日志消息中,我想您会推断出如何做到这一点。
    • 我这样做了,花了一个小时才弄清楚为什么它在 prod 上不起作用。发现在 prod 中修改了 subclass_prefix。对于其他难以完成这项工作的人,请仔细检查您的 config.php subclass_prefix。这可能是原因。哇!谢谢@mog!
    【解决方案2】:

    我相信如果你想要这个,你必须通过创建一个custom 404 page 并手动记录到日志文件来自己记录它。你可以通过$_SERVER['REMOTE_ADDR']访问PHP中的IP地址。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 2016-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      相关资源
      最近更新 更多