<-
Apache > HTTP Server > Documentation > Version 2.0 > Developer Documentation

Обработка Запроса в Apacheе 2.0

предупреждение

предупреждение - это - первый (быстрый) проект, который нуждается в дальнейшем пересмотре!

несколько изменений в Apacheе 2.0 затрагивают внутренний запрос, обрабатывающий механику. Авторы модуля должны знать об этих изменениях, таким образом они могут использовать в своих интересах повышения безопасности и оптимизацию.

первое главное изменение к подзапросу и переадресовывать механизмы. Было множество различных кодовых дорожек в Apacheе 1.3, чтобы попытаться оптимизировать подзапрос или переадресовать поведение. Поскольку участки были введены 2.0, эта оптимизация (и поведение сервера) была быстро сломана из-за этого дублирования кодекса. Весь двойной кодекс был отложен в ap_process_request_internal() препятствовать кодексу падать из синхронизации снова.

это означает так, что большая часть существующего кодекса была 'неоптимизирована'. Это - первая цель Apacheского Проекта HTTP создать здравое и правильное выполнение сервера HTTP RFC. Дополнительные цели включают безопасность, масштабируемость и оптимизацию. Новые методы разыскивались, чтобы оптимизировать сервер (вне работы Apacheа 1.3), не вводя хрупкий или опасный кодекс.

top

The Request Processing Cycle

все запросы проходят ap_process_request_internal() в request.c , включение подзапросов и переадресовывает. Если модуль не передает произведенные запросы через этот кодекс, автора предостерегают, что модуль может быть сломан будущими изменениями, чтобы просить обработку.

чтобы упрощать запросы, автор модуля может использовать в своих интересах крюки, предлагаемые, чтобы выпасть из цикла запроса рано, или обойти основные Apacheские крюки, которые являются несоответствующими (и дорогостоящими в терминах центрального процессора.)

top

The Request Parsing Phase

Unescapes the URL

запрос parsed_uri дорожка является несбежавшей, однажды и только однажды, в начале внутренней обработки запроса.

этот шаг обходится, если proxyreq флаг установлен, или parsed_uri.path элемент сброшен. Модуль не имеет никакого дальнейшего контроля этой одноразовой операции неспасения, или бывшей не в состоянии неубегать или умножать невозможность избежать URL приводит к безопасности reprecussions.

Strips Parent and This Elements from the URI

все /../ и /./ элементы удалены ap_getparents() . это помогает гарантировать, что дорожка (почти) абсолютна прежде, чем обработка запроса продолжается.

этот шаг не может обойтись.

Initial URI Location Walk

каждый запрос подчинен ap_location_walk() звонить. Это гарантирует этому <Location> секции последовательно предписаны для всех запросов. Если запрос - внутреннее, переадресовывают или подзапрос, это может заимствовать некоторых или всю обработку от ap_location_walk предыдущего или родительского запроса, таким образом этот шаг вообще очень эффективен после обработки главного запроса.

translate_name

модули могут определить название файла, или изменить данных ТУРОВ в этом шаге. Например, mod_vhost_alias переведет дорожку ТУРОВ на формируемого действительного хозяина, mod_alias переведет дорожку к дорожке псевдонима, и если запрос возвращается к ядру, DocumentRoot пред на рассмотрении к ресурсу запроса.

если все модули DECLINE эта фаза, ошибка 500 возвращена к браузеру, и "не мог перевести название" ошибка, зарегистрирован автоматически.

Hook: map_to_storage

после того, как файл или правильные ТУРЫ были определены, соответствующие в-директора конфигурации слиты вместе. Например, mod_proxy сравнивает и сливает соответствующее <Proxy> секции. Если ТУРЫ - не что иное как местный житель (неполномочие) TRACE запрос, ядро обращается с запросом и возвращениями DONE . если никакой модуль не отвечает на этот крюк с OK или DONE , ядро будет управлять именем файла запроса против <Directory> и <Files> секции. Если запрос 'имя файла' не абсолютное, юридическое имя файла, примечание установлено для более позднего завершения.

URI Location Walk

каждый запрос укреплен на секунду ap_location_walk() звонить. Это заверяет, что переведенный запрос все еще подвергается формируемому <Location> секции. Запрос снова заимствует некоторых или всю обработку от его предыдущего location_walk выше, таким образом этот шаг почти всегда очень эффективен, если переведенные ТУРЫ не нанесли на карту к существенно различной дорожке или Действительному Хозяину.

Hook: header_parser

главный запрос тогда разбирает удары головой клиента. Это готовит остающийся запрос, обрабатывающий шаги, чтобы лучше служить запросу клиента.

top

The Security Phase

Документация Потребностей. Кодекс:

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; }
top

The Preparation Phase

Hook: type_checker

модули имеют возможность проверить ТУРОВ или имя файла против целевого ресурса, и установить информацию пантомимы для запроса. Оба mod_mime и mod_mime_magic использовать эту фазу, чтобы сравнить название файла или содержание против конфигурации администратора и установить довольный тип, язык, набор символов и тренера запроса. Некоторые модули могут настроить их фильтры или другой запрос, обращающийся с параметрами в это время.

если все модули DECLINE эта фаза, ошибка 500 возвращена к браузеру, и "не мог найти, что типы" ошибка зарегистрированы автоматически.

Hook: fixups

много модулей 'наказаны' некоторой фазой выше. fixups фаза используется модулями, чтобы 'подтвердить' их собственность или вызвать области запроса к их соответствующим ценностям. Это - не всегда самый чистый механизм, но иногда это - единственный выбор.

top

The Handler Phase

эта фаза нет часть обработки в ap_process_request_internal() . много модулей готовят один или более подзапросов до создания любого содержания вообще. После ядра, или звонит модуль ap_process_request_internal() это тогда звонит ap_invoke_handler() производить запрос.

Hook: insert_filter

модули, которые преобразовывают содержание в некотором роде, могут вставить их ценности и отвергнуть существующие фильтры, такой что, если пользователь формировал более передовой фильтр не в порядке, то модуль может переместить его заказ как потребность быть. Нет никакого кодекса результата, таким образом действия в этом крюке лучше доверяться, чтобы всегда преуспеть.

Hook: handler

модуль наконец имеет шанс служить запросу в его крюке тренера. Отметьте, что не каждый готовый запрос посылают крюку тренера. Много модулей, типа mod_autoindex , создаст подзапросы о данных ТУРАХ, и затем никогда не будет служить подзапросу, но просто перечисляет это для пользователя. Не забудьте не помещать требуемое разрушение от крюков выше в этот модуль, но уборки объединения регистра против объединения запроса, чтобы освободить ресурсы как требуется.