Давайте посмотрим на него построчно
<IfModule mod_rewrite.c>
Это говорит о том, что все, что между тегами должны быть прочитаны только в том случае, если и только если установлен mod_rewrite и включен на целевом сервере.
RewriteEngine On
Включает RewriteEngine. Без него никакие RewriteRules не вступают в силу. (docs)
RewriteBase/
RewriteBase используется при перенаправлении запроса. Насколько мне известно, никогда не помешает установить его, хотя иногда это происходит автоматически. (docs)
RewriteRule ^index\.php$ - [L]
Это первый RewriteRule. Если запрос сделан http://example.com/index.php
(с строкой запроса или без нее), URL-адрес не будет перезаписан. Значение [L]
означает, что если это правило соответствует, это последнее правило, которое будет соответствовать во время этого «прохода» через файл. Поскольку URL не переписывается, дальнейшие «проходы» через файл .htaccess
не выполняются.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
Если предыдущее правило не совпало, оно будет пытаться соответствовать этому правилу. Это правило соответствует любому URL-адресу не менее 1 символа. Запрос http://example.com
не соответствует этому правилу. Если первая часть RewriteRule будет соответствовать, она проверит условия. Первое условие проверяет, является ли запрашиваемый файл (%{REQUEST_FILENAME}
) не существующим файлом (!-f
). -f
означает «это существующий файл», и префикс !
отрицает это. Второе условие аналогично, но проверяет, не является ли запрошенный файл не существующим каталогом. Если оба условия верны, запрос будет внутренне переписан на index.php
. Флаг [L]
остановит переписывание для этого прохода, а во время следующего прохода первое правило будет совпадать и полностью прекратит переписывание.
См. the documentation для получения дополнительной информации о том, что возможно с RewriteCond
и RewriteRule
.
Отличное, очень четкое объяснение. Спасибо за ссылки ссылки тоже. Ура! – Johny