301 Перенаправление URL-адресов на основе переменных GET в .htaccess - PullRequest
3 голосов
/ 16 мая 2009

У меня есть несколько старых грязных 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/welcome

http://www.example.com/page.php/prices

Я понимаю, что могу перенаправить одну страницу на другую с помощью простого перенаправления, т.е.

Redirect 301 /bunch.of/unneeded/crap http://www.example.com/page.php

Но исходная страница не меняется, только это GET vars. Я не могу понять, как основать перенаправление на значении этих переменных GET. Кто-нибудь может помочь, пожалуйста !? Я довольно удобен со старыми регулярными выражениями, так что я могу иметь возможность использовать mod-rewrite, если мне нужно, но я не совсем понимаю синтаксис для переписывания переменных GET, и я предпочел бы избежать падения производительности и использовать очиститель Redirect директива. Есть ли способ? и если нет, кто-нибудь может подсказать мне, как правильно переписать мод синтаксис pls?

Приветствия

Роджер.

Ответы [ 3 ]

5 голосов
/ 16 мая 2009

Поскольку параметры в 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]
1 голос
/ 24 июля 2010

@ Джек Росс

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-адресу, на который отправляется пользователь, иметь ту же строку запроса, что и страница источника.

0 голосов
/ 16 мая 2009

Таким образом, вы можете использовать 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
...