Есть файл .htaccess. Среди прочего в нем записано: Код (Text): RewriteEngine on RewriteRule ^([^/\.]+)?$ index.php?page=$1 [L] Еще на прошлой неделе эта конструкция работала безупречно. Сегодня же при обращении к страницам вида http://my-site.com/first http://my-site.com/second http://my-site.com/third это срабатывает только при условии что на сервере нет каталогов first, second и third. Иначе происходит редирект (видимый через браузер как 301) на страницы http://my-site.com/first/?page=first Как заставить обрабатывать все страницы скриптом index.php без редиректов (ведь слетают все отправляемые post данные)? Вроде недавно хоcтер-провайдер обновил ПО. Грешу на него.
Только что проверил - оставил в htaccess только эти две строки Код (Text): RewriteEngine on RewriteRule ^([^/\.]+)?$ index.php?page=$1 [L] Снова произошел редирект на http://my-site.com/first/?page=first и появилась надпись: Хотя каталог first по идее доступен всем. В каталоге находится пара изображений. Но вопрос сейчас не в этом.
Я так понимаю, что ранее в конфиге было что-то ещё, но сейчас ты это удалил, оставив только эти две строчки? Если так, то интересно, что было в конфиге ранее. Дело в том, что 301-й редирект - это Moved Permanently, что означает "Перемещено навсегда". Браузер запоминает все такие редиректы ("кеширует") и если ты однажды перешёл по ссылке http://www.example.com/path а сервер тебе в ответ выдал Код (Text): HTTP/1.1 301 Moved Permanently Location: http://www.example.com/path?page=path то браузер это запомнил. И теперь, когда ты вновь вводишь в адресной строке http://www.example.com/path то браузер даже не делает запроса к серверу по этому адресу. Он сам (браузер) "по старой памяти" заменяет http://www.example.com/path на http://www.example.com/path?page=path и идёт за контентом уже туда. Вот такая фигня. Так что баловаться с mod_rewrite на боевом сервере очень опасное развлечение. Может получиться так, что потом придётся просить всех пользователей чистить кеш в браузере... Попробуй сейчас (после удаления всего лишнего из htaccess) скачать какой-нибудь новый браузер, которого у тебя ещё не было, и из него зайти по желаемому адресу. То что я написал выше - это личный опыт. Я нигде этого не читал, статей таких не видел. Просто личные наблюдения. Так что можно считать ИМХО. В общем, проверь из нового браузера. Если всё равно не пашет - будем думать дальше. Добавлено спустя 7 минут 5 секунд: П.С. На сколько я понимаю, помимо браузеров, 301-е редиректы также запоминают и поисковики. И если на сайте на какой-то страничке был установлен ошибочный 301-й редирект, а поисковики его увидели - то пичалька...
Потестил немного... Допёр в чём загвоздка. Apache всегда делает 301-й редирект, если запрашивается url папки без слэша на конце. То есть, допустим, на сайте есть папка /folder тогда если мы делаем запрос по адресу http://www.example.com/folder то Apache будет перенаправлять нас по адресу http://www.example.com/folder/ На сколько я понимаю - так уж он устроен. Не нашёл я параметров в конфиге, которыми можно было бы это поведение отключить. Может, плохо искал... Спать охота. Завтра попробую ещё глянуть - самому интересно. В общем, он делает этот редирект, даже если вообще никаких правил mod_rewrite нету. И если правила есть - он их обработает, но редирект всё равно сделает. Внешний. В итоге в адресной строке красуется наше безобразие http://www.example.com/folder/?page=folder То есть он, как и положено, правилами RewriteRule - приписал в конец Код (Text): ?page=$1 Но так как была запрошена папка (как он считает), но на конце не стоит слэша - то надо его приписать Пробовал обмануть его - с помощью того же mod_rewrite дописывать этот слэш на конец запрошенного url, если на сервере есть реальная папка, соответствующая запросу и при этом в запросе на конце нет слэша - не прокатило. Всё равно редиректит. Пробовал эти правила прописывать и в .htaccess и в httpd.conf (сервер перезагружал) - всё равно не работает. Походу, он сперва принимает решение о том, нужно ли делать этот внешний редирект, связанный с отсутствием слэша на конце url-а, соответствующего папке, а уже только потом выполняет все эти правила mod_rewrite. В общем, интересно всё же понять, возможно ли как-то это сделать или нет. Но уже не сейчас, конечно, завтра... если время будет. А пока единственное, что могу посоветовать - либо генерировать ссылки со слэшем на конце, либо просто исключить вообще возможность создания "виртуальных" (реврайтных) url-ов, которые соответствуют реальным папкам ФС.
"Запоминания" браузером редиректа 301 к счастью не наблюдается. Так как если из моего примера переименовать на сервере каталог first в first1, то ссылка http://my-site.com/first открывается как следует (без редиректа), а не как http://my-site.com/first/?page=first, но http://my-site.com/first1 отправляет на http://my-site.com/first1/?page=first1 С дописыванием слешей в конце через .htaccess тоже пробовал "обмануть" и тоже ничего не получилось.
Позвольте поднять тему - проблема так и осталась открыта. По совету sobachnik переписал большинство ссылок с завершающим /. Но для всех ссылок это сделать не получится. Требуется помощь!
Сделайте еще обработчик со стороны php. С заменой адреса. Чтобы когда заходили на ?page=page php менял на /page.