mod_rewrite: что делает этот RewriteRule? - PullRequest
27 голосов
/ 20 января 2010

Учитывая эти условия (я знаю, что они означают / делают):

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d 

Что делает правило first ?Для чего нужен этот одинокий тире?

RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ /index.php [NC,L]

Я уже довольно давно использую это в сочетании с Zend Framework, но я так и не понял, что именно делает первое правило.

1 Ответ

51 голосов
/ 20 января 2010

Директива RewriteCond просто описывает дополнительное условие для директивы RewriteRule . Так что RewriteCond всегда должно быть связано с RewriteRule.

В вашем случае три RewriteCond, вероятно, принадлежат первому RewriteRule следующим образом:

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]

Теперь это правило применяется, если шаблон RewriteRule совпадает с текущим URL-адресом запроса (путь к каталогу удален ранее) и , если условие выполнено.

В этом случае условие выполняется только в том случае, если при сопоставлении URL-адреса запроса с файловой системой оно соответствует либо существующему файлу с размером файла больше 0 (-s), либо символической ссылке (-l), либо каталог (-d). Таким образом, ваше правило будет применяться к любому URL (^.*$ соответствует чему угодно), который может быть сопоставлен с чем-то, существующим в вашей файловой системе. Подстановка - просто означает не менять ничего. И NC ( без регистра , без учета регистра, бесполезен в этом контексте) и L (последнее правило, если применяется) являются flags , которые изменить шаблон, замену или выполнение правила.

...