Apache Версия 2.0 Сервера HTTP
этот документ обсуждает некоторые из технических деталей соответствия URL и mod_rewrite.
внутренняя обработка этого модуля очень сложна, но нужно объясниться однажды даже среднему пользователю, чтобы избежать общих ошибок и позволить Вам эксплуатировать его полные функциональные возможности.
сначала Вы должны понять, что, когда Apache обрабатывает HTTP, просят, чтобы это сделало это в фазах. Крюк для каждой из этих фаз обеспечивается Apacheским программным интерфейсом приложения. Mod_rewrite использует два из этих крюков: крюк перевода URL-К-ИМЕНИ-ФАЙЛА, который используется после запроса HTTP, был прочитан, но перед любыми запусками разрешения и крюком Fixup, который вызван после фаз разрешения и после в-справочник config файлов (
.htaccess
) были прочитаны, но прежде, чем довольный тренер активизирован.
Так, после того, как запрос входит, и Apache определил соответствующий сервер (или действительный сервер), двигатель переписывания начинает обрабатывать из всех mod_rewrite директив от в-сервер конфигурации в фазе URL-К-ИМЕНИ-ФАЙЛА. Несколько шагов позже, когда заключительные справочники данных найдены, в-справочник директивы конфигурации mod_rewrite, вызваны в фазе Fixup. В обеих ситуациях mod_rewrite переписывает URL или к новым URL или к именам файла, хотя нет никакого очевидного различия между ними. Это - использование программного интерфейса приложения, который не был предназначен, чтобы быть этим путем, когда программный интерфейс приложения был разработан, но на Apacheа 1.x это - единственный путь mod_rewrite, может работать. Сделать этот более ясный пункт помнят следующие два пункта:
.htaccess
файлы, хотя они достигнуты очень долгое время после URL, были переведены к именам файла. Это должен быть этот путь потому что
.htaccess
файлы, живые в файловой системе, таким образом обрабатывая уже достигли этой стадии. Другими словами: Согласно фазам программного интерфейса приложения в это время это - слишком поздно для любых манипуляций URL. Чтобы преодолевать этого цыпленка и проблему яйца, mod_rewrite использует уловку: Когда Вы управляете URL/именем файла во в-справочник контексте mod_rewrite, сначала переписывает имя файла назад к его соответствующему URL (который является обычно невозможным, но видеть
RewriteBase
директива ниже для уловки, чтобы достигнуть этого), и затем начинает новый внутренний подзапрос с новым URL. Это повторно начинает обрабатывать из фаз программного интерфейса приложения.
снова mod_rewrite пробует трудно сделать этот сложный шаг полностью прозрачным пользователю, но Вы должны помнить здесь: В то время как манипуляции URL во в-сервер контексте действительно быстры и эффективны, в-справочник переписывает, медленны и неэффективны из-за этого цыпленка и проблемы яйца. Но с другой стороны это - единственный путь mod_rewrite, может обеспечить (в местном масштабе ограниченный) манипуляции URL среднему пользователю.
не забывать эти два пункта!
теперь, когда mod_rewrite вызван в этих двух фазах программного интерфейса приложения, это читает формируемый rulesets от его структуры конфигурации (который непосредственно был или создан на запуске для в-сервер контекста или в течение директивной прогулки Apacheского ядра для в-справочник контекста). Тогда URL, переписывая двигатель начат с содержавшегося ruleset (одно или более правил вместе с их условиями). Операция URL, переписывая сам двигатель - точно то же самое для обоих контекстов конфигурации. Только заключительная обработка результата отлична.
заказ правил в ruleset важен, потому что двигатель переписывания обрабатывает их в специальном (и не очень очевидный) заказ. Правило - это: переписывающие машинные петли через ruleset управляют по правилу (
RewriteRule
директивы) и когда специфическое правило соответствует этому произвольно петли через существующие соответствующие условия (
RewriteCond
директивы). По историческим причинам условия даются сначала, и таким образом поток контроля немного многоречив. См. иллюстрацию 1 для большего количества деталей.
иллюстрация 1:
поток контроля через переписывание ruleset
поскольку Вы можете видеть, сначала URL подобран против образец из каждого правила. Когда это терпит неудачу, mod_rewrite немедленно прекращает обрабатывать это правило и продолжается со следующим правилом. Если образец спички, mod_rewrite ищет соответствующие условия правила. Если ни один не присутствует, это только заменяет URL с новой ценностью, которая построена из вереницы замена и продолжает его перекручивание правила. Но если условия существуют, это начинает внутреннюю петлю для того, чтобы обработать их в заказе, что они перечислены. Для условий логика отлична: мы не соответствуем образцу против текущего URL. Вместо этого мы сначала создаем вереницу TestString расширяя переменные, заднюю-часть-ссылки, поиски карты, и т.д. и затем мы пробуем соответствовать CondPattern против этого. Если образец не соответствует, полный набор условий и соответствующего правила терпит неудачу. Если образец соответствует, то следующее условие обработано, пока не больше условий не доступно. Если все условия соответствуют, обработка продолжена с заменой URL с замена .