301 Перенаправление URL-адресов на основе переменных GET в .htaccess
-
22-08-2019 - |
Вопрос
У меня есть несколько старых грязных URL-адресов, например...
http://www.example.com/bunch.of/unneeded/crap?opendocument&part=1
http://www.example.com/bunch.of/unneeded/crap?opendocument&part=2
...что я хочу перенаправить на более новую, более чистую форму...
http://www.example.com/page.php/добро пожаловать
http://www.example.com/page.php/prices
Я понимаю, что могу перенаправить одну страницу на другую с помощью простого перенаправления, т.е.
Перенаправление 301 /bunch.of/unneeded/crap http://www.example.com/page.php
Но исходная страница не меняется, а только переменные GET.Я не могу понять, как основывать перенаправление на значении этих переменных GET.Кто-нибудь может помочь, пожалуйста!?Я довольно хорошо разбираюсь в старых регулярных выражениях, поэтому могу попробовать использовать mod-rewrite, если понадобится, но я не совсем понимаю синтаксис переписывания переменных GET, и я бы предпочел избежать снижения производительности и использовать очиститель директивы перенаправления.Есть ли способ?и если нет, может ли кто-нибудь подсказать мне правильный синтаксис перезаписи мода, пожалуйста?
Ваше здоровье,
Роджер.
Решение
Поскольку параметры в URL-запросе могут иметь произвольный порядок, вам необходимо использовать любой из них. RewriteCond
директива для каждого проверяемого параметра или для всех возможных перестановок.
Вот пример с RewriteCond
директива для каждого параметра:
RewriteCond %{QUERY_STRING} ^([^&]&)*opendocument(&|$)
RewriteCond %{QUERY_STRING} ^([^&]&)*part=1(&|$)
RewriteRule ^bunch\.of/unneeded/crap$ /page.php/welcome? [L,R=301]
RewriteCond %{QUERY_STRING} ^([^&]&)*opendocument(&|$)
RewriteCond %{QUERY_STRING} ^([^&]&)*part=2(&|$)
RewriteRule ^bunch\.of/unneeded/crap$ /page.php/prices? [L,R=301]
Но, как видите, это может привести к путанице.
Поэтому лучшим подходом может быть использование RewriteMap
.Самым простым будет обычный текстовый файл с ключ и ценить пары:
1 welcome
2 prices
Чтобы определить карту, напишите следующую директиву в конфигурации вашего сервера или виртуального хоста (эта директива недопустима в контексте каждого каталога):
RewriteMap examplemap txt:/path/to/file/map.txt
Тогда вам понадобится всего лишь одно правило:
RewriteCond %{QUERY_STRING} ^([^&]&)*opendocument(&|$)
RewriteCond %{QUERY_STRING} ^([^&]&)*part=([0-9]+)(&|$)
RewriteRule ^bunch\.of/unneeded/crap$ /page.php/%{examplemap:%2}? [L,R=301]
Другие советы
@Джек Росс
RewriteCond %{QUERY_STRING} option=com_content&task=view&id=70&Itemid=82
RewriteRule ^index.php http://www.domain.com/business/banks/? [R=301,L]
?не позволит URL-адресу, на который отправляется пользователь, иметь ту же строку запроса, что и исходная страница.
Таким образом, вы можете использовать RedirectMatch
с регулярным выражением, которое будет соответствовать полному URL-адресу, включая строку запроса.Это позволит вам изменить порядок частей URL-адреса, но если вам нужно выполнить преобразование типа «opendocument&part=1» в «welcome» (когда новый URL-адрес полностью отличается от исходного), вам может понадобиться RewriteMap
- или, возможно, лучше, просто отправьте все URL-адреса на page.php
и проанализировать строку запроса в PHP.
РЕДАКТИРОВАТЬ:Если вы хотите перенаправить всего несколько URL-адресов, вы, вероятно, могли бы написать отдельные правила, например
RedirectPermanent http://www.example.com/bunch.of/unneeded/crap?opendocument&part=1 http://www.example.com/page.php/welcome
RedirectPermanent http://www.example.com/bunch.of/unneeded/crap?opendocument&part=2 http://www.example.com/page.php/prices