*/ if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../').'/'); require_once(DOKU_CONF.'dokuwiki.php'); /** * украсить идентификатор страницы вики для журнала * * Идентификатор страницы вики будет преобразован в строку имени файла * коды utf8 будут закодированы. * * @param $id идентификатор вики-страницы * * @автор Маттиас Гримм */ function prepareID($path){ $path = cleanID($path); $path = str_replace(':','/',$path); $path = utf8_encodeFN($path); return $path; } /** * проверяет, существует ли файл, и возвращает соответствующий веб-адрес * статус сервера * * @param $file полный путь к файлу для проверки * * @автор Маттиас Гримм */ function getStatus($file){ if(@file_exists($file)){ $size = @filesize($file); return "200 $size"; }else return "404 0"; } /** * регистрирует доступ к вики-странице * * @param $id идентификатор страницы вики, включая пространство имен * * @автор Маттиас Гримм */ function logPageAccess($id){ global $ACT; if ($ACT == 'show'){ $page = prepareID($id); $crumbs = breadcrumbs(); // получить последние посещенные страницы $crumbs = array_keys($crumbs); // получить необработанные идентификаторы страниц array_pop($crumbs); // пропустить текущую страницу $referer = array_pop($crumbs); // получить предыдущую страницу текущей страницы $referer = ($referer) ? prepareID($referer) : ''; logAccess($page,getStatus(wikiFN($id)),$referer); } } /** * регистрирует доступ к медиафайлу (внутренний или внешний) * * @param $media url или путь к медиа в dokuwiki * @param $file полный путь к медиафайлу * * @автор Маттиас Гримм */ function logMediaAccess($media,$file){ if(!preg_match('#^(https?|ftp)://#i',$media)) $media = prepareID($media); logAccess($media,getStatus($file)); } /** * создает запись в файле журнала и записывает ее в журнал * * Эта функция записывает информацию о доступе к текущей странице в журнал * файл. Он использует комбинированный формат файла журнала, который также используется * веб-сервер apache. Целая куча доступных анализаторов логов может быть * используется для визуализации журнала. * * @param $page имя вызванной страницы * @param $status HTTP-код статуса, за которым следует размер файла * @param $referer предшественник $page (какая страница ссылается на $page) * Если это поле пустое, функция пытается получить * реферер с веб-сервера (HTTP_REFERER) * * @автор Маттиас Гримм * * комбинированный формат файла журнала: * <хост> <пользователь> [<метка времени>] "<запрос>" <ошибка> <размер файла> * "<реферер>" "<агент>"\n * * IP-адрес клиентского хоста (мы не делаем обратный поиск хоста) * удаленная идентификация пользователя или «-», если недоступно * <пользователь> идентификатор пользователя или «-», если недоступно * время в формате [01/Dec/2005:22:19:12 +0200] * Запрошенный протокол, например GET или POST, запрошенная страница * и протокол * код ошибки от сервера, например, 200 (OK) или 404 (файл * не найдено) * размер страницы вики (только голый текст) * страница, которая вызвала эту. У нас нет этой информации * и заполнил имя скрипта dokuwiki. * идентифицирующая информация, которую сообщает клиентский браузер * о себе */ function logAccess($page,$status,$referer=''){ global $conf; if (!empty($conf['accesslog'])){ $host = $_SERVER['REMOTE_ADDR']; $user = isset($_SERVER['REMOTE_USER']) ? $_SERVER['REMOTE_USER'] : "-"; $timestamp = date("[d/M/Y:H:i:s O]"); $method = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : ""; $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : ""; $agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ""; if (empty($referer)){ if(isset($_SERVER['HTTP_REFERER'])){ $cnt = preg_match('/\?id=((\w+\:*)+)/i',$_SERVER['HTTP_REFERER'], $match); if($cnt == 1) $referer = prepareID($match[1]); } } $logline = "$host - $user $timestamp \"$method $page $protocol\" $status \"$referer\" \"$agent\"\n"; io_saveFile($conf['accesslog'], $logline, true); } } //Настройка VIM: например: et ts=2 enc=utf-8 :