2012-06-21 2 views
2

Я пытаюсь лучше понять mod_rewrite от Apache, и у меня неожиданные результаты. Я пробовал много разных выражений, но ничто, кажется, не ведет себя так, как я понимаю.Apache mod_rewrite оканчивающиеся периоды

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-l 

RewriteRule ^(.*)$ index.php?route=$1 [QSA,L] 

Использование www.domain.com/item1/item2/item3 урожайности item1/item2/item3
Использование www.domain.com/item1/item2/item3.php урожайности item1/item2/item3.php
Использование www.domain.com/item1/item2/item3........... урожайности item1/item2/item3

Почему это не item1/item2/item3...........?

Как ни странно, если URL является www.domain.com/item1/item2/item3..........a, маршрут, что я ожидаю, item1/item2/item3..........a

Я попробовал несколько других регулярных выражений, но они действуют аналогичным образом.

спасибо.

+1

Искал документации такого поведения, но не смог найти его. Похоже, у других людей есть один и тот же опыт: mod_rewrite strips trailing dots: http://stackoverflow.com/questions/2280805/trailing-dots-being-stripped-from-url – jgivoni

+0

Хммм, спасибо за ссылку. Я не смог найти его. Похоже, это правильное поведение mod_rewrite. – Quantastical

ответ

1

В то время как я до сих пор не нашел никакой документации, объясняющей, почему Apache/.htaccess/mod_rewrite ведет себя таким образом, у меня есть альтернатива, если кто-нибудь столкнется с этим.

Вместо использования .htaccess передать запрашиваемое имя файла в переменную запроса, как route в моем вопросе выше, в PHP есть некоторые переменные сервера, которые можно использовать. Итак, я изменил мою логику в index.php от чтения строки запроса:

trim($_SERVER['REDIRECT_URL'], "/"); 

REDIRECT_URL (и REQUEST_URI) переменного сервера сохранят хвостовые точки, и дифферент получит начальный и завершающие слеши прочь, подобно к тому, что происходит с правилом перезаписи.