Что делает следующий код mod_rewrite? - PullRequest
1 голос
/ 20 декабря 2010

Мне было интересно, что делает следующий код mod_rewrite, может кто-нибудь объяснить код подробно?

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L]

Ответы [ 2 ]

4 голосов
/ 20 декабря 2010

Интерпретация построчно:

RewriteRule .* index.php [L]

Сначала будет интерпретироваться и соответствовать каждому запросу (сопоставляется с частью URL после имени хоста и порта и перед строкой запроса)..* - это регулярное выражение, которое всегда соответствует.Лучшее и более быстрое правило может быть таким:

RewriteRule ^ index.php [L]

^ в выражении регулярного выражения, соответствует каждой строке, которая имеет начало.Это равно .* -> совпадать с каждой вещью.

После того, как совпадение было найдено, обработка продолжится с RewriteCond (itions).Два RewriteCondition связаны невидимой логикой AND.Этот блок будет совпадать, только если оба RewriteConditions имеют значение true.

RewriteCond %{REQUEST_FILENAME} !-f # Check if given file is not a file AND 
RewriteCond %{REQUEST_FILENAME} !-d # Check if given directory is not a file and 

Пример. Если на сервере будет установлена ​​следующая файловая структура.

.
|-- css
|   `-- base.css
|-- img
|   `-- logo.png
`-- index.php

Если вы запрашиваете пример URL.com / css / base.css произойдут следующие шаги.

  1. Соответствует RewriteRule (соответствует все время)
  2. Не будет соответствовать RewriteCond %{REQUEST_FILENAME} !-f, поскольку css/base.css - это файл.
  3. RewriteRule будет пропущен из-за отсутствия совпадений, при обработке будут проверены другие правила и условия *

Если вы запросите пример URL.com / ru / about произойдут следующие шаги:

  1. Соответствует RewriteRule (соответствует постоянно)
  2. Соответствует RewriteCond %{REQUEST_FILENAME} !-f, потому чтоen/about - это не файл.
  3. Совпадение RewriteCond %{REQUEST_FILENAME} !-d, поскольку en/about - это не каталог.
  4. Комбинация RewriteRule и RewriteCond создала положительное совпадение ->
  5. Перенаправить запрос на index.php с флагом L

Флаг L означает последнее правило , которое остановит обработку,Подробнее о flags .

Эта комбинация правил часто используется для перенаправления всех запросов в одну точку входа веб-приложения.Чтобы не обслуживать статический контент index.php, файлы и каталоги будут обслуживаться веб-сервером, а не index.php.Диспетчеризация динамического запроса сайта будет выполняться в логике index.php.

*. Правильный поток данных можно найти здесь

3 голосов
/ 20 декабря 2010

Переписывает все запросы, которые не соответствуют файлу ((!-f)) или каталогу ((!-d)) на диске, в index.php. [L] говорит mod_rewrite прекратить обработку правил после этого.

...