Испльзую код
RewriteEngine on
RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]
все работает пока не создаю папку с таким же названием как и у ссылки
mysite.ru/catalog/ - работает
mysite.ru/catalog - работает
создаю папку catalog
mysite.ru/catalog/ - работает
mysite.ru/catalog - работает, но в строке браузера превращается в mysite.ru/catalog/?route=catalog
Под работает я подразумеваю, что переменная $_GET['route'] содержит корректные данные. Даже когда добавляет в конец /?route=catalog
Удалил все из index.php. Он теперь пустой, но проблема осталась.
Сделал чистый проект test.loc пустая папка catalog, .htaccess(смотри выше), index.php(пустой)
если ссылка без слеша он добавляет его, а не /?route=catalog
(Поправка после нескольких тестов в тестовом проекте тоже стал выдавать /?route=catalog, получается весь проект две строчки в которых нет ошибки значит дело в настройках сервера?)
Тестирую на локальной машине (Версия: Денвер-3 2012-09-16)
Подскажите пожалуйста почему и как исправить
Ответ
Насколько мне удалось понять, когда Apache встречает путь, который указывает на каталог, он посылает клиенту ответ с перенаправлением, причём делает это после обработки модулем mod_rewrite. Именно поэтому правило
RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]
добавит параметр к GET-запросу, а затем Apache выполнит перенаправление.
Избежать такого поведения можно, запретив серверу дописывать / в адресе, ссылающемся на каталог. Делается это при помощи директивы
DirectorySlash Off
Для решения задачи файл .htaccess должен иметь следующий вид:
DirectorySlash Off
RewriteEngine On
RewriteCond %{REQUEST_URI} !/index.php
RewriteRule (.*) /index.php?route=$1 [L,QSA]
Обратите внимание на предпоследнюю строку. Она предотвращает зацикливание.
Комментариев нет:
Отправить комментарий