Что делают эти две строки в Mod_Rewrite?

Я пытаюсь понять, что делают эти две строки в Mod_Rewrite, и хотел бы помочь. Заранее спасибо.

RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ $1.php 

Они проверяют, является ли запрошенный URI существующим файлом или каталогом. ! перед этим условие «нет», поэтому запрос НЕ привязывается к файлу или каталогу.

См. Описание -f и -d в mod_rewrite


Не все запросы сопоставляются с некоторым файлом, чтобы он мог быть загружен браузером?

Нет. Запрос может быть для чего-то, чего не существует и будет переписан. Например, http://en.wikipedia.org/wiki/something будет означать, что URI является /wiki/something , который не сопоставляется ни с каким физическим файлом или каталогом. Но внутри есть правило, которое переписывает /wiki/something to index.php?title=something , а index.php действительно существует.


Изменить: для отредактированного вопроса

  • 2 условия: если запрошенный URI не сопоставляется с файлом или каталогом, примените следующее правило.
  • Правило: возьмите любой запрос и добавьте .php в конец.
  • Логика этого: mod_rewrite петли, пока URI, который входит в механизм перезаписи, и URI, который выходит из него, идентичен. Без проверки, чтобы увидеть, совпадает ли URI с физическим файлом или каталогом, правило будет циклическим:
    • URI in = / something
    • Условия проверки: / что-то не существует
    • Применить правило, URI в = /something.php
    • Проверьте условия: /something.php EXISTS, не применяйте правило
    • URI in = URI out = /something.php, прекратить переписывание
  • В противном случае без проверок !-f и !-d :
    • URI in = / something
    • Применить правило, URI = /something.php
    • URI in = /something.php
    • Применить правило, URI = /something.php.php
    • URI in = /something.php.php
    • Применить правило, URI = /something.php.php.php
    • цикл до бесконечности до тех пор, пока apache не решит остановиться и не вернет ошибку 500