За последние 24 часа нас посетили 18119 программистов и 1628 роботов. Сейчас ищут 1397 программистов ...

Проблема редиректа в .htaccess

Тема в разделе "Регулярные выражения", создана пользователем mironoffalex, 19 окт 2012.

  1. mironoffalex

    mironoffalex Активный пользователь

    С нами с:
    19 окт 2012
    Сообщения:
    4
    Симпатии:
    0
    Есть файл .htaccess. Среди прочего в нем записано:
    Код (Text):
    1. RewriteEngine on
    2. 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тер-провайдер обновил ПО. Грешу на него.
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    покаж целиком конфиг, плс
     
  3. mironoffalex

    mironoffalex Активный пользователь

    С нами с:
    19 окт 2012
    Сообщения:
    4
    Симпатии:
    0
    Только что проверил - оставил в htaccess только эти две строки
    Код (Text):
    1. RewriteEngine on
    2. RewriteRule ^([^/\.]+)?$   index.php?page=$1 [L]
    Снова произошел редирект на http://my-site.com/first/?page=first и появилась надпись:
    Хотя каталог first по идее доступен всем. В каталоге находится пара изображений. Но вопрос сейчас не в этом.
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    К сожалению я плохо шарю в таких делах. Подождём, может ктонить еще проснётся и отпишется. =)
     
  5. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Я так понимаю, что ранее в конфиге было что-то ещё, но сейчас ты это удалил, оставив только эти две строчки? Если так, то интересно, что было в конфиге ранее.
    Дело в том, что
    301-й редирект - это Moved Permanently, что означает "Перемещено навсегда". Браузер запоминает все такие редиректы ("кеширует") и если ты однажды перешёл по ссылке
    http://www.example.com/path
    а сервер тебе в ответ выдал
    Код (Text):
    1. HTTP/1.1 301 Moved Permanently
    2. 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-й редирект, а поисковики его увидели - то пичалька...
     
  6. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Потестил немного... Допёр в чём загвоздка.
    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):
    1. ?page=$1
    Но так как была запрошена папка (как он считает), но на конце не стоит слэша - то надо его приписать :)

    Пробовал обмануть его - с помощью того же mod_rewrite дописывать этот слэш на конец запрошенного url, если на сервере есть реальная папка, соответствующая запросу и при этом в запросе на конце нет слэша - не прокатило. Всё равно редиректит. Пробовал эти правила прописывать и в .htaccess и в httpd.conf (сервер перезагружал) - всё равно не работает. Походу, он сперва принимает решение о том, нужно ли делать этот внешний редирект, связанный с отсутствием слэша на конце url-а, соответствующего папке, а уже только потом выполняет все эти правила mod_rewrite. В общем, интересно всё же понять, возможно ли как-то это сделать или нет. Но уже не сейчас, конечно, завтра... если время будет.

    А пока единственное, что могу посоветовать - либо генерировать ссылки со слэшем на конце, либо просто исключить вообще возможность создания "виртуальных" (реврайтных) url-ов, которые соответствуют реальным папкам ФС.
     
  7. mironoffalex

    mironoffalex Активный пользователь

    С нами с:
    19 окт 2012
    Сообщения:
    4
    Симпатии:
    0
    "Запоминания" браузером редиректа 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 тоже пробовал "обмануть" и тоже ничего не получилось.
     
  8. mironoffalex

    mironoffalex Активный пользователь

    С нами с:
    19 окт 2012
    Сообщения:
    4
    Симпатии:
    0
    Позвольте поднять тему - проблема так и осталась открыта. По совету sobachnik переписал большинство ссылок с завершающим /. Но для всех ссылок это сделать не получится. Требуется помощь!
     
  9. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Сделайте еще обработчик со стороны php.
    С заменой адреса.
    Чтобы когда заходили на ?page=page php менял на /page.