301 Перенаправление URL-адресов на основе переменных GET в .htaccess

StackOverflow https://stackoverflow.com/questions/871511

Вопрос

У меня есть несколько старых грязных 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top