- Автор темы
- #1
Атрибут rel="canonical" конечно рулит, но любопытно расставить интересующие параметры строго в одном порядке именно средствами mod_rewrite.
Допустим, есть три параметра param1,param2,param3 и в адресе они должны быть объявлены именно в таком порядке и при любых перестановках нужно делать редирект на адрес с правильным порядком, попутно удаляя любые лишние параметры.
Реализовать думаю так: извлекать параметры по одному, попутно собирая их в строку в нужном порядке, после сравнить с исходной строкой параметров и только в случае несовпадения делать редирект, используя собранную в нужном порядке строку.
Например:
/?param3=lol&bla=bla¶m1=foo¶m2=bar => /?param1=foo¶m2=bar¶m3=lol
Эти правила делают редирект только для адресов, где есть все три параметра.
Если какие-то из параметров необязательные решить можно так:
Или так
Допустим, есть три параметра param1,param2,param3 и в адресе они должны быть объявлены именно в таком порядке и при любых перестановках нужно делать редирект на адрес с правильным порядком, попутно удаляя любые лишние параметры.
Реализовать думаю так: извлекать параметры по одному, попутно собирая их в строку в нужном порядке, после сравнить с исходной строкой параметров и только в случае несовпадения делать редирект, используя собранную в нужном порядке строку.
Например:
/?param3=lol&bla=bla¶m1=foo¶m2=bar => /?param1=foo¶m2=bar¶m3=lol
Код:
RewriteCond &%{QUERY_STRING} &(param1=[^&]+)
RewriteCond %1\ &%{QUERY_STRING} ^(\S+).+(¶m2=[^&]+)
RewriteCond %1%2\ &%{QUERY_STRING} ^(\S+).+(¶m3=[^&]+)
RewriteCond %1%2\ %{QUERY_STRING} ^(\S+)\ (?!\1$)
RewriteRule .* /$0?%1 [R=301,L]
Эти правила делают редирект только для адресов, где есть все три параметра.
Если какие-то из параметров необязательные решить можно так:
Код:
RewriteCond &%{QUERY_STRING} (?:(¶m1=[^&]+)|(¶m2=[^&]+)|(¶m3=[^&]+)|&[^&]+)+
RewriteCond &%1%2%3\ %{QUERY_STRING} ^&++(\S*)\ (?!\1$)
RewriteRule .* /$0?%1 [R=301,L]
Или так
Код:
RewriteCond &%{QUERY_STRING} (?:(¶m1=[^&]+)|(¶m2=[^&]+)|(¶m3=[^&]+)|&[^&]+)+
RewriteCond &%1%2%3\ %{THE_REQUEST} ^&++(\S*+)[^?]+\?(?!\1[#\ ])
RewriteRule .* /$0?%1 [R=301,L]