За последние 24 часа нас посетили 54080 программистов и 1765 роботов. Сейчас ищут 1650 программистов ...

ЧПУ и GET из формы

Тема в разделе "Прочие вопросы по PHP", создана пользователем Okula, 10 фев 2012.

  1. Okula

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

    С нами с:
    13 дек 2011
    Сообщения:
    20
    Симпатии:
    1
    В постраничной навигации есть форма для быстрого перехода на нужную страницу, но если передавать через неё номер страницы то параметр GET будет записываться в переменную QUERY_STRING и ссылка из такой
    Код (Text):
    1. /папка/папка2/номер_страницы/
    превращается в:
    Код (Text):
    1. /папка/папка2/?page=номер_страницы
    и на указанную страницу не перебрасывает.

    Как можно сделать чтоб значение из формы записывалось сразу в правильный вид или чтобы модреврайт сам формировал в дальнейшем правильную ссылку.

    Как я пробовал решить эту проблемму:
    Код (Text):
    1. RewriteEngine On
    2.  
    3. RewriteCond %{QUERY_STRING} \?page=([0-9]+)
    4. RewriteRule (.*)\?page=([0-9]+)$ $1/?$2 [R,L]
    Я попробовал ещё так
    Код (Text):
    1. RewriteRule ^(.*)\?page=([0-9]+)$ $1$2 [R]
    Результата нет.
     
  2. asokol

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

    С нами с:
    17 янв 2012
    Сообщения:
    162
    Симпатии:
    0
    Думать, читать и думать, что писать.
    RewriteRule ^(.*)/p([0-9]+) $1/?page=$2 [L]
    - это означает, что при открытии страницы /news/p1 этот адрес будет преобразован в /news/?page=1. В PHP-скрипте надо при этом проверять $_GET['page']. В "форме для быстрого перехода" создавать ссылки вида /news/p1, а не с помощью mod_rewrite делать редирект с /news/?page=1 на /news/p1.
     
  3. Okula

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

    С нами с:
    13 дек 2011
    Сообщения:
    20
    Симпатии:
    1
    В целом у меня mod_rewrite настроен, но когда передаются данные из формы методом GET, а это как раз параметр page,
    то он автоматически дописывается к ссылке как значение QUERY_STRING
    Это как раз и сбивает все настройки и получается что я перехажу не по ссылке
    /dir/12 - где 12 это номер страницы, а по
    /dir/?page=12 , что эдентично /dir/index.php?page=12

    Вот в чём проблемма.
     
  4. AndreJM

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

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Код (Text):
    1. RewriteCond %{QUERY_STRING} ^page=([0-9]+)$
    2. RewriteRule ^(.*)/(.*)/$ http://мой сайт/$1/$2/%1 [R,L]
    как-то так, кстринги конечно будут висеть в урле, но добавится конд
     
  5. Okula

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

    С нами с:
    13 дек 2011
    Сообщения:
    20
    Симпатии:
    1
    С этим разобрался.
    Возникла другая проблемма при передаче слеша в ссылке.
    Ссылка такого вида:
    Код (Text):
    1. p_ziprar/2209/f=admentor/adserve.asp/
    где после f= идёт GET параметр f ( $_GET['f'] ), но из-за того что передаются слеши ссылка кидает на 404, помогите исправить ошибку.
    Вот правило которое я использую:
    Код (Text):
    1. RewriteRule ^p_([a-z_]+)/([0-9]+)/f=(.*)/ $1.php?id=$2&f=$3 [NC,L]
     
  6. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    яваскриптом можно отправлять форму куда захочется изменяя action формыпри клике или просто по событию сабмита.
     
  7. Okula

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

    С нами с:
    13 дек 2011
    Сообщения:
    20
    Симпатии:
    1
    Я не с формой работаю, с первой проблемой я уже разобрался сам.
    Проблема с автоматическим экранированием слешев при mod_rewrit'е
     
  8. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    дык если ты сам там всем рулишь, напиши правило .* index.php и парси $_SERVER['REQUEST_URI'] эксплодом без всяких слешей и гемороя =)
     
  9. Okula

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

    С нами с:
    13 дек 2011
    Сообщения:
    20
    Симпатии:
    1
    Если бы это было так просто, меня апач кидает на 404 страницу, он сволочь всё сам экранирует, не зависимо от того что я уже сделал.
    [​IMG]
     
  10. asokol

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

    С нами с:
    17 янв 2012
    Сообщения:
    162
    Симпатии:
    0
    Apache не экранирует слэши. Разберитесь с тем кодом, который формирует ссылку вида f=.
    mod_rewrite для того, чтобы тот адрес, который был запрошен, преобразовать к виду, который будет понятен Вашему скрипту. Если Вы не хотите использовать javascript при отправке формы (чтобы сформировать адрес в виде /dir/12), то можно, конечно, делать редирект, но, на мой взгляд - это излишне.
     
  11. Okula

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

    С нами с:
    13 дек 2011
    Сообщения:
    20
    Симпатии:
    1
    asokol, у меня нет никакой формы, у меня идёт чтение ZIP архивов и добраться до какого-либо конкретного файла можно только по путям, вот поэтому путь и риходится передавать через GET запрос.
     
  12. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    пасинг реквест_ури самый здравый способ. а откуда лезут слеши не очень понятно. надо задать всякие мэджик квотес в офф
     
  13. Okula

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

    С нами с:
    13 дек 2011
    Сообщения:
    20
    Симпатии:
    1
    magic quote применятся совсем для другого. Этот модуль не экранирует прямые слеши, только обратные, символ NULL и кавычки (одинарные и двойные).
    Тут он совсем нипричём, к тому же он по умолчанию выключен в новых версиях PHP