Ведение логов доступа к файлам на хостинге

Как быть, если access-логи web-сервера недоступны, а необходимо знать в каком количестве и куда документы скачиваются. При этом движок сайта не использует mod_rewrite, для переопределения страниц. Решить проблему поможет наше блюдо. Оно быстро в приготовлении, и не требует ничего такого, что трудно достать.

Ингредиенты

Для приготовления нашего блюда понадобится:

  1. web-хостинг на базе apache модулем mod_rewrite поддержкой php
  2. Доступ к нему по FTP
  3. Немного терпения

Приготовление

Каталог для логов

Создадим в корне сайта (как правило, это каталог www или htdocs) подкаталог logs. Установите ему права достаточные, для того, чтобы web-сервер смог в неё писать (например 666 или rw-rw-rw-).

Скрипт, ведущий логи доступа

Создадим в корне сайта php-скрипт следующего содержания:

<?php

// Если нет нужной нам для определения mime-type функции,
// то придётся изобрести мальнький велосипедик
if ( ! function_exists ( "mime_content_type " ) )
{
   function mime_content_type ( $f )
   {
       return trim ( exec ("file -bi " . escapeshellarg ( $f ) ) ) ;
   }
}

function write_log(){
    // Функция, пишущая логи доступа в файл
    $log_string=
        "".date("Y-m-d H:i:s").   // Дата доступа к файлу
        "\t".$_SERVER["REQUEST_URI"]. // IP с которого загружали документ
        "\t".$_SERVER["REMOTE_ADDR"]. // IP с которого загружали документ
        "\t".$_SERVER["HTTP_REFERER"].// REFERER откуда пришли
        "\r\n";
    // Открываем файл для добавления и пишем туда лог
    $fd=fopen($_SERVER["DOCUMENT_ROOT"]."/tmp/".date("Y-m-d").".log","a");
    fwrite($fd,$log_string);
    fclose($fd);
}

function error404(){
    header("HTTP/1.x 404 Not Found");
    echo "Not Found";
    die;
}

function error403(){
    header("HTTP/1.x 403 Forbidden");
    echo "Forbidden";
    die;
}

// Список возможных индексных файлов
$indexes=array("index.php","index.html","index.htm","index.shtml","index.phtml");

// Пишем данные в лог
write_log();

// Определяем путь запрашиваемо файла в ФС, отсекая QUERY_STRING
$filename=$_SERVER["DOCUMENT_ROOT"].preg_replace("/^(.*?)\?.*$/","$1",$_SERVER["REQUEST_URI"]);

// Признак 403-й
$forbidden=1;
// Если имя в ФС имеет место, разбираемся, что за имя
if(file_exists($filename)){
    // Если это не обычный файл (каталог), определяем есть ли там индексный файл
    if(!is_file($filename)){
        foreach($indexes as $directory_index){
            if(!is_file($filename) && file_exists($filename.$directory_index)){
                $filename=$filename.$directory_index;
                $forbidden=0;
                break;
            }
        }
    }else{
        $forbidden=0;
    }
}else{
    // Вызов 404-й
    error404();
}

if($forbidden){
    // Вызов 403-й
    error403();
}

// Если запрашиваемый пользователем файл - скрипт, php, то
// Подключаем его к этому, и тем самым обеспечиваем выполнение
if(preg_match("/^.*php(\?.*){0,1}$/",$filename)){
    include($filename);
    die;
}else{
// Иначе выводим содержимое запрашиваемого файла
    $filecontent=implode("",file($filename));
    header("Content-type: ".mime_content_type($filename)."");
    echo $filecontent;
    die;
}

?>

Создание файла .htaccess

Создадим файл .htaccess в корне сайта и добавим туда следующие строки:

RewriteEngine On # Включаем mod_rewrite
RewriteRule ^(.*)$ logger.php [L,QSA] # Все запросы направляем в logger.php

Заключение

Бюдо готово. Приятного аппетита. Более опытный повар может внести в него свои оттенки вкуса, организовав, к примеру, запись логов в БД.


Добавить комментарий