Запутывающая особенность mod_rewrite
заключается в том, что после внутреннего перенаправления , даже если квалифицирован как [L]
, , весь набор правил обрабатывается снова с самого начала.
Таким образом, вы перенаправляете несуществующий путь на index.php
, но затем вводите правила добавления косой черты, и вы не получаете желаемого результата.
В вашем случае вам просто нужно поместить условие несуществования файла в оба правила перенаправления:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule [^/]$ %{REQUEST_URI}/ [L,R]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ /my/path/index.php [L]
Или, возможно, переместить это условие в начало файла:
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L] # redirect to same location to stop processing
RewriteRule [^/]$ %{REQUEST_URI}/ [L,R]
RewriteRule ^ /my/path/index.php [L]
Существует также недокументированный прием для остановки обработки после внутреннего перенаправления, который должен облегчить написание более сложных наборов правил - с помощью переменной окружения REDIRECT_STATUS
, которая устанавливается после внутреннего перенаправления:
RewriteCond %{ENV:REDIRECT_STATUS} . # <-- that's a dot there
RewriteRule ^ - [L] # redirect to same location to stop processing
RewriteRule [^/]$ %{REQUEST_URI}/ [L,R]
RewriteRule ^ /my/path/index.php [L]