Перезапись URL, включая косую черту, если ее нет - PullRequest
2 голосов
/ 25 февраля 2011

У меня есть RewriteRule для работы.

RewriteBase /my/path/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /my/path/index.php [L]

Так что URL с косой чертой работают.http://localhost/my/path/foo/bar/
Проблема в том, что URL-адреса без завершающей косой черты будут нарушать относительные ссылки.Плюс это выглядит не очень хорошо.

Это достигает максимального количества внутренних перенаправлений.

RewriteRule ^/my/path/(.*[^/])$ $1/ [R]
RewriteRule . /my/path/index.php [L]

И это будет делать ... http://localhost/my/path/index.php/bar/

RewriteRule . /my/path/index.php
RewriteRule ^/my/path/(.*[^/])$ $1/ [R,L]

Есть идеи или решения?

1 Ответ

2 голосов
/ 25 февраля 2011

Запутывающая особенность 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]
...