301 редирект index.php?t=&page= в папку?

Тема в разделе "Mod Rewrite / htaccess / ЧПУ", создана пользователем z3rg, 2 дек 2014.

  1. z3rg

    z3rg

    Регистр.:
    2 фев 2007
    Сообщения:
    731
    Симпатии:
    337
    Нужно чтобы со страниц вида:

    Код:
    http://site.ru/showthread.php?t=1&page=2 
    http://site.ru/showthread.php?t=1
    
    перенаправляло на:
    Код:
    http://site.ru/threads/1/page-2
    http://site.ru/threads/1
    
    У меня получилось только сделать вот так.
    Код:
    RewriteCond %{QUERY_STRING}  ^t=(.*)$
    RewriteRule ^showthread\.php$  /threads/%1 [L,R=301]
    
    Но так подставляются лишние параметры
    /showthread.php?t=33333 -> /threads/33333?t=33333

    Первый вопрос как убрать лишнее ?t=33333

    И еще как сделать чтобы с /showthread.php?t=1&page=2 на /threads/1/page-2 перенаправляло.
    Только чтобы перенаправляло в том случае если есть page=N, в остальных случаях на /threads/1.



     
  2. UJy

    UJy

    Регистр.:
    23 авг 2011
    Сообщения:
    365
    Симпатии:
    130
    Убирается знаком вопроса в конце...
    Код:
    RewriteCond %{QUERY_STRING}  ^t=(.*)$
    RewriteRule ^showthread\.php$  /threads/%1? [L,R=301]
    
    Делается посредством двух правил, которые выставлены в правильном порядке:
    Код:
    RewriteCond %{QUERY_STRING}  ^t=([\d]+)$
    RewriteRule ^showthread\.php$  /threads/%1? [R=301,L]
    
    RewriteCond %{QUERY_STRING}  ^t=(.*)page=(.*)$
    RewriteRule ^showthread\.php$  /threads/%1/page-%2? [R=301,L]
    
    Будет работать ТОЛЬКО если аргумент t = циферный
     
    z3rg нравится это.
  3. z3rg

    z3rg

    Регистр.:
    2 фев 2007
    Сообщения:
    731
    Симпатии:
    337
    А еще вопрос. А что если перестановка параметров местами. ?page=2&t=1671 заместо ?t=1671&page=2 и к примеру таких параметров много то это уже средствами php делается?
     
  4. UJy

    UJy

    Регистр.:
    23 авг 2011
    Сообщения:
    365
    Симпатии:
    130
    Смотря насколько большое количество параметров. при вменяемом количестве параметров - можно предусмотреть разные урлы и в htaccess, но лучше сделать на php - намного меньше гемора и выше скорость обработки...

    PS: при малой посещаемости разницы в скорости работы конечно не будет заметно, но при больших нагрузках - будет заметно.
     
  5. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    217
    Симпатии:
    281
    В шаблоне перед page амперсанд потерялся и первая скобка захватит его в %1.
    Тогда "?t=4&page=5" перенаправит на /threads/4&/page-5

    Если подумать, то можно запихнуть все в один RewriteRule
    Код:
    RewriteCond %{QUERY_STRING}    ^t=(\d+)(?:&page=(\d+))?$|^page=(\d+)&t=(\d+)$
    RewriteCond %1%4/page-%2%3     ^(\d+(/page-\d+)?)
    RewriteRule ^showthread\.php$  /threads/%1? [R=301,L]
    
    /showthread.php?t=7 >> /threads/7
    /showthread.php?t=7&page=2 >> /threads/7/page-2
    /showthread.php?page=2&t=7 >> /threads/7/page-2



    А если попытаться впихнуть невпихуемое, то выходит какая-то жуть
    Код:
    RewriteCond %{QUERY_STRING}/page- ^t=(\d+)(?:(?:&page=(\d+)(/page-))|/page-)$|^page=(\d+)&t=(\d+)(/page-)$
    RewriteRule ^showthread\.php$  /threads/%1%5%3%6%2%4? [R=301,L]
    
     
    Последнее редактирование: 3 дек 2014
    UJy и z3rg нравится это.
  6. UJy

    UJy

    Регистр.:
    23 авг 2011
    Сообщения:
    365
    Симпатии:
    130
    Любопытненько... А можно Вас попросить разжевать некоторые моменты? Извиняюсь, если вопросы Вам покажутся совсем уж дикие, просто хочу разобраться.
    1) Что в данной конструкции означает элемент ?: и обязательно ли он должен быть внутри круглых скобок?
    2) Какую функцию выполняет знак вопроса перед знаком конца строки $ и обязательно ли он должен стоять после закрывающей скобки?
    3) Как идет нумерация скобок в этой конструкции? Так как на скрине, или иначе?
    [​IMG]
    4) RewriteCond %{QUERY_STRING} some-text - данная конструкция проверяет содержится ли в строке параметров текст "some-text", а что проверяет конструкция "RewriteCond %1%4/page-%2%3 ^(\d+(/page-\d+)?)" ?
    Я понял так: она проверяет совпадает ли конструкция, которая состоит из составляющих "%1%4/page-%2%3" с маской ^(\d+(/page-\d+)?) (от начала строки сколько угодно циферок, затем слэш, потом page-, потом снова сколько угодно циферок). Или я не правильно понял сути данной проверки?
    5) Зачем (или с какой целью) в последнем RewriteCond после %{QUERY_STRING} идет /page-

    Хотел было ещё попросить прочитать данную конструкцию словами, уж очень она, для моего понимания, замороченной выглядит (если Вам не сложно)
    Код:
    RewriteCond %{QUERY_STRING}/page- ^t=(\d+)(?:(?:&page=(\d+)(/page-))|/page-)$|^page=(\d+)&t=(\d+)(/page-)$
    RewriteRule ^showthread\.php$  /threads/%1%5%3%6%2%4? [R=301,L]
    
     
  7. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    217
    Симпатии:
    281
    Скобки позволяют группировать и захватывать.
    (?:шаблон) позволяет группировать без захвата.

    (&page=\d+)? знак вопроса здесь квантификатор и указывает сколько раз предшествующее выражение может встречаться.
    Квантификаторы
    ? ноль или один раз
    * ноль или более
    + один или более

    Визуализация ^t=(\d+)(?:&page=(\d+))?$ http://www.regexper.com/#^t=(\d+)(?:&page=(\d+))?$

    http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritecond
    В TestString можно использовать $0-9 из RewriteRule и то что было захвачено в %1-9 из RewriteCond.

    https://www.debuggex.com/r/9Fe6WaYp16mugMF8

    https://www.debuggex.com/r/1R2EYEE0mND88azf
     
    Последнее редактирование: 3 дек 2014
    UJy нравится это.
  8. UJy

    UJy

    Регистр.:
    23 авг 2011
    Сообщения:
    365
    Симпатии:
    130
    Отдельное спасибо за визуализатор...

    А ещё раз можно сказать о RewriteCond %1%4/page-%2%3 ^(\d+(/page-\d+)?)
    Я понял, что тут можно использовать захваченные группы в предыдущем конде, но не въехал какую оно функцию выполняет в данном конкретном примере?

    Оно там стоит для того, что б правило с 2 переменными размещенными по разные стороны "или" превратилось в 1 правило, которое и вставляется в конечный Rewriterule?
     
  9. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    217
    Симпатии:
    281
    Из "?t=7&page=2" и "?page=2&t=7" соберет строку "7/page-2", а из "?t=7" получится "7/page-".
    Шаблон ^(\d+(/page-\d+)?) позволяет из строки "7/page-" в переменную %1 захватить только "7"
     
    UJy нравится это.