2015-10-11 6 views
0

Просто хочу что-то подтвердить. Из того, что я собираю, как работает mod_rewrite, Apache получает URL-адрес и сразу же применяет mod_rewrite (не < каталог >) в httpd.conf, затем переписывает mod-rewriting для каждого каталога, а затем перезапускает процесс с новым URL-адресом, если любые изменения сделаны. @ Отличный ответ JonLin на this question гласит, что когда ваше правило для каждой директории специфицирует абсолютную замену (то есть, начиная с косой черты), предполагается, что это относится к DocumentRoot, который я получаю. Но относительных замен (не слэш) Джон затем говорит:.mod_rewrite поведение, когда нет rewriteBase

он основан на директории, что правило находится в Так, если

RewriteRule^Foo $ bar.php [L]

находится в «корне», и вы переходите к http://example.com/foo, вам предоставляется http://example.com/bar.php. Но если это правило находится в каталоге «subdir1», и вы переходите на http://example.com/subdir1/foo, вы получаете сообщение http://example.com/subdir1/bar.php. и т. д. Это иногда срабатывает, а иногда и нет, как говорит документация, предполагается, что он необходим для относительных путей, но большую часть времени он работает. За исключением случаев, когда вы перенаправляете (используя флаг R или неявно, потому что у вас есть хост http: // в целевом элементе вашего правила). Это означает, что это правило:

RewriteRule^Foo $ bar.php [L, R]

, если он находится в директории "subdir2", и вы идете в http://example.com/ subdir2/foo, mod_rewrite допустит относительный путь как путь к файлу вместо URL-пути, а из-за флага R вы получите перенаправление на что-то вроде: http://example.com/var/www/локальный/HTDOCS/subdir1.

Как Джон объясняет в последнем бите, когда редирект будет происходить и когда нет никакого RewriteBase, строки, предназначенной в качестве путь_к_файла добавляемых к базовому адресу сайта, чтобы создать фальшивый URL. Но только для подтверждения, даже в первом случае Джон упоминает, т.е. не фактическое перенаправление, замещенная строка отправляется обратно в код приема URL-адреса Apache, перезагружая весь процесс, правильно? Диаграмма на this page of the spec, по-видимому, подразумевает, что до тех пор, пока никакие правила не вносят изменения, процесс продолжает перезапуск. Эти случаи, не связанные с переадресацией, похоже, были временем, когда было бы целесообразно прикрепить путь к файлу прямо из корня файловой системы в каталог htaccess в начале подстановки. Но как это превращается в правильный URL-адрес, как ожидалось, кодом доступа к URL-адресу - делает ли http://localhost предпочтительным? Я думаю, что это сделает все относительно документа, а не фактического корня файловой системы.

Спасибо!

ответ

0

Проделал еще немного чтения и подумал, что я объяснил это всем, кто интересуется. Что касается моего вопроса о том, как абсолютный путь файловой системы превращается в действительный URL для внутреннего перенаправления, я думал, что URI в HTTP-запросе содержит «http: // hostname», но это было отключено, т. Е. URI подобен/this/is/a/path. Имя хоста находится в отдельном поле заголовка «Хост» и больше не является важной частью информации к моменту запуска mod_rewrite, поскольку начальная фаза Apache Post Read Request уже заметила запрос GET на порт и, если виртуальный виртуальный Хостинг используется, интерпретирует такие вещи, как DocumentRoot, из поля заголовка хоста и, наконец, называется URI Translation Phase, где выполняется mod_rewrite. Поэтому в любое время, когда mod_rewrite запущен, может быть только одно имя хоста, которое привело нас сюда.

Итак, что я назвал частью URL-приема Apache, всегда имеет дело с/paths/like/this/without/hostname, а не только после внутренних переадресаций. Спецификация говорит, что rewriteCond/rewriteRule соответствует таким путям, но я решил, что имя хоста было там первоначально и удалено. Итак, все, что осталось, это обеспечить, чтобы наши правила были подготовлены для случаев, когда они работают во внутреннем перенаправлении, порожденном более ранним прохождением, и не делают что-то непреднамеренное, когда они видят абсолютный путь файловой системы, вызванный заменой, t начните с косой черты. Какой глоток.

Смежные вопросы