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

z3rg

Мой дом здесь!
Регистрация
2 Фев 2007
Сообщения
732
Реакции
344
Нужно чтобы со страниц вида:

Код:
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.



 
Первый вопрос как убрать лишнее ?t=33333
Убирается знаком вопроса в конце...
Код:
RewriteCond %{QUERY_STRING}  ^t=(.*)$
RewriteRule ^showthread\.php$  /threads/%1? [L,R=301]
И еще как сделать чтобы с /showthread.php?t=1&page=2 на /threads/1/page-2 перенаправляло.
Только чтобы перенаправляло в том случае если есть page=N, в остальных случаях на /threads/1.
Делается посредством двух правил, которые выставлены в правильном порядке:
Код:
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
А еще вопрос. А что если перестановка параметров местами. ?page=2&t=1671 заместо ?t=1671&page=2 и к примеру таких параметров много то это уже средствами php делается?
 
Смотря насколько большое количество параметров. при вменяемом количестве параметров - можно предусмотреть разные урлы и в htaccess, но лучше сделать на php - намного меньше гемора и выше скорость обработки...

PS: при малой посещаемости разницы в скорости работы конечно не будет заметно, но при больших нагрузках - будет заметно.
 
RewriteCond %{QUERY_STRING} ^t=(.*)page=(.*)$
В шаблоне перед 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]
 
Последнее редактирование:
Любопытненько... А можно Вас попросить разжевать некоторые моменты? Извиняюсь, если вопросы Вам покажутся совсем уж дикие, просто хочу разобраться.
1) Что в данной конструкции означает элемент ?: и обязательно ли он должен быть внутри круглых скобок?
2) Какую функцию выполняет знак вопроса перед знаком конца строки $ и обязательно ли он должен стоять после закрывающей скобки?
3) Как идет нумерация скобок в этой конструкции? Так как на скрине, или иначе?
c5f40d63dc.jpg

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]
 
Скобки позволяют группировать и захватывать.
(?:шаблон) позволяет Для просмотра ссылки Войди или Зарегистрируйся.

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

Визуализация ^t=(\d+)(?:&page=(\d+))?$ Для просмотра ссылки Войди или Зарегистрируйся

Для просмотра ссылки Войди или Зарегистрируйся
RewriteCond TestString CondPattern

TestString is a string which can contain the following expanded constructs in addition to plain text:

  • RewriteRule backreferences: These are backreferences of the form $N (0 <= N <= 9), which provide access to the grouped parts (in parentheses) of the pattern, from the RewriteRule which is subject to the current set of RewriteCond conditions..
  • RewriteCond backreferences: These are backreferences of the form %N (1 <= N <= 9), which provide access to the grouped parts (again, in parentheses) of the pattern, from the last matched RewriteCond in the current set of conditions.
В TestString можно использовать $0-9 из RewriteRule и то что было захвачено в %1-9 из RewriteCond.

Для просмотра ссылки Войди или Зарегистрируйся

Для просмотра ссылки Войди или Зарегистрируйся
 
Последнее редактирование:
  • Нравится
Реакции: UJy
Отдельное спасибо за визуализатор...

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

Оно там стоит для того, что б правило с 2 переменными размещенными по разные стороны "или" превратилось в 1 правило, которое и вставляется в конечный Rewriterule?
 
Из "?t=7&page=2" и "?page=2&t=7" соберет строку "7/page-2", а из "?t=7" получится "7/page-".
Шаблон ^(\d+(/page-\d+)?) позволяет из строки "7/page-" в переменную %1 захватить только "7"
 
  • Нравится
Реакции: UJy
Назад
Сверху