Страницы

Поиск по вопросам

понедельник, 15 июля 2019 г.

Переадресация всех страниц на одну в .htaccess

Испльзую код
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]
Обратите внимание на предпоследнюю строку. Она предотвращает зацикливание.

Комментариев нет:

Отправить комментарий