Apache Версия 2.0 Сервера HTTP
предупреждение - это - первый (быстрый) проект, который нуждается в дальнейшем пересмотре!
несколько изменений в Apacheе 2.0 затрагивают внутренний запрос, обрабатывающий механику. Авторы модуля должны знать об этих изменениях, таким образом они могут использовать в своих интересах повышения безопасности и оптимизацию.
первое главное изменение к подзапросу и переадресовывать механизмы. Было множество различных кодовых дорожек в Apacheе 1.3, чтобы попытаться оптимизировать подзапрос или переадресовать поведение. Поскольку участки были введены 2.0, эта оптимизация (и поведение сервера) была быстро сломана из-за этого дублирования кодекса. Весь двойной кодекс был отложен в
ap_process_request_internal()
препятствовать кодексу падать из синхронизации снова.
это означает так, что большая часть существующего кодекса была 'неоптимизирована'. Это - первая цель Apacheского Проекта HTTP создать здравое и правильное выполнение сервера HTTP RFC. Дополнительные цели включают безопасность, масштабируемость и оптимизацию. Новые методы разыскивались, чтобы оптимизировать сервер (вне работы Apacheа 1.3), не вводя хрупкий или опасный кодекс.
все запросы проходят
ap_process_request_internal()
в
request.c
, включение подзапросов и переадресовывает. Если модуль не передает произведенные запросы через этот кодекс, автора предостерегают, что модуль может быть сломан будущими изменениями, чтобы просить обработку.
чтобы упрощать запросы, автор модуля может использовать в своих интересах крюки, предлагаемые, чтобы выпасть из цикла запроса рано, или обойти основные Apacheские крюки, которые являются несоответствующими (и дорогостоящими в терминах центрального процессора.)
запрос
parsed_uri
дорожка является несбежавшей, однажды и только однажды, в начале внутренней обработки запроса.
этот шаг обходится, если proxyreq флаг установлен, или
parsed_uri.path
элемент сброшен. Модуль не имеет никакого дальнейшего контроля этой одноразовой операции неспасения, или бывшей не в состоянии неубегать или умножать невозможность избежать URL приводит к безопасности reprecussions.
все
/../
и
/./
элементы удалены
ap_getparents()
. это помогает гарантировать, что дорожка (почти) абсолютна прежде, чем обработка запроса продолжается.
этот шаг не может обойтись.
каждый запрос подчинен
ap_location_walk()
звонить. Это гарантирует этому
<Location>
секции последовательно предписаны для всех запросов. Если запрос - внутреннее, переадресовывают или подзапрос, это может заимствовать некоторых или всю обработку от ap_location_walk предыдущего или родительского запроса, таким образом этот шаг вообще очень эффективен после обработки главного запроса.
модули могут определить название файла, или изменить данных ТУРОВ в этом шаге. Например,
mod_vhost_alias
переведет дорожку ТУРОВ на формируемого действительного хозяина,
mod_alias
переведет дорожку к дорожке псевдонима, и если запрос возвращается к ядру,
DocumentRoot
пред на рассмотрении к ресурсу запроса.
если все модули
DECLINE
эта фаза, ошибка 500 возвращена к браузеру, и "не мог перевести название" ошибка, зарегистрирован автоматически.
после того, как файл или правильные ТУРЫ были определены, соответствующие в-директора конфигурации слиты вместе. Например,
mod_proxy
сравнивает и сливает соответствующее
<Proxy>
секции. Если ТУРЫ - не что иное как местный житель (неполномочие)
TRACE
запрос, ядро обращается с запросом и возвращениями
DONE
. если никакой модуль не отвечает на этот крюк с
OK
или
DONE
, ядро будет управлять именем файла запроса против
<Directory>
и
<Files>
секции. Если запрос 'имя файла' не абсолютное, юридическое имя файла, примечание установлено для более позднего завершения.
каждый запрос укреплен на секунду
ap_location_walk()
звонить. Это заверяет, что переведенный запрос все еще подвергается формируемому
<Location>
секции. Запрос снова заимствует некоторых или всю обработку от его предыдущего
location_walk
выше, таким образом этот шаг почти всегда очень эффективен, если переведенные ТУРЫ не нанесли на карту к существенно различной дорожке или Действительному Хозяину.
главный запрос тогда разбирает удары головой клиента. Это готовит остающийся запрос, обрабатывающий шаги, чтобы лучше служить запросу клиента.
Документация Потребностей. Кодекс:
switch (ap_satisfies(r)) { case SATISFY_ALL: case SATISFY_NOSPEC: if ((access_status = ap_run_access_checker(r)) != 0) { return decl_die(access_status, "check access", r); } if (ap_some_auth_required(r)) { if (((access_status = ap_run_check_user_id(r)) != 0) || !ap_auth_type(r)) { return decl_die(access_status, ap_auth_type(r) ? "check user. No user file?" : "perform authentication. AuthType not set!", r); } if (((access_status = ap_run_auth_checker(r)) != 0) || !ap_auth_type(r)) { return decl_die(access_status, ap_auth_type(r) ? "check access. No groups file?" : "perform authentication. AuthType not set!", r); } } break; case SATISFY_ANY: if (((access_status = ap_run_access_checker(r)) != 0)) { if (!ap_some_auth_required(r)) { return decl_die(access_status, "check access", r); } if (((access_status = ap_run_check_user_id(r)) != 0) || !ap_auth_type(r)) { return decl_die(access_status, ap_auth_type(r) ? "check user. No user file?" : "perform authentication. AuthType not set!", r); } if (((access_status = ap_run_auth_checker(r)) != 0) || !ap_auth_type(r)) { return decl_die(access_status, ap_auth_type(r) ? "check access. No groups file?" : "perform authentication. AuthType not set!", r); } } break; }
модули имеют возможность проверить ТУРОВ или имя файла против целевого ресурса, и установить информацию пантомимы для запроса. Оба
mod_mime
и
mod_mime_magic
использовать эту фазу, чтобы сравнить название файла или содержание против конфигурации администратора и установить довольный тип, язык, набор символов и тренера запроса. Некоторые модули могут настроить их фильтры или другой запрос, обращающийся с параметрами в это время.
если все модули
DECLINE
эта фаза, ошибка 500 возвращена к браузеру, и "не мог найти, что типы" ошибка зарегистрированы автоматически.
много модулей 'наказаны' некоторой фазой выше. fixups фаза используется модулями, чтобы 'подтвердить' их собственность или вызвать области запроса к их соответствующим ценностям. Это - не всегда самый чистый механизм, но иногда это - единственный выбор.
эта фаза
нет
часть обработки в
ap_process_request_internal()
. много модулей готовят один или более подзапросов до создания любого содержания вообще. После ядра, или звонит модуль
ap_process_request_internal()
это тогда звонит
ap_invoke_handler()
производить запрос.
модули, которые преобразовывают содержание в некотором роде, могут вставить их ценности и отвергнуть существующие фильтры, такой что, если пользователь формировал более передовой фильтр не в порядке, то модуль может переместить его заказ как потребность быть. Нет никакого кодекса результата, таким образом действия в этом крюке лучше доверяться, чтобы всегда преуспеть.
модуль наконец имеет шанс служить запросу в его крюке тренера. Отметьте, что не каждый готовый запрос посылают крюку тренера. Много модулей, типа
mod_autoindex
, создаст подзапросы о данных ТУРАХ, и затем никогда не будет служить подзапросу, но просто перечисляет это для пользователя. Не забудьте не помещать требуемое разрушение от крюков выше в этот модуль, но уборки объединения регистра против объединения запроса, чтобы освободить ресурсы как требуется.