3

У меня есть несколько грязных старых URL-адресов, как ...301 Перенаправление URL, основанный на GET переменных в .htaccess

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 ВАР. Я не могу понять, как настроить перенаправление на значение этих переменных GET. Может кто-нибудь помочь PLS !? Я довольно удобен со старыми регулярными выражениями, поэтому я могу использовать pop-rewrite, если придется, но я не понимаю синтаксиса для перезаписи GET-варов, и я предпочел бы избежать удара по производительности и использовать чистая директива Redirect. Есть ли способ? и если нет, кто-нибудь подскажет мне, что касается правильного синтаксиса pl-rewrite?

Cheers,

Roger.

+0

Вы действительно хотите перенаправить запросы '/bunch.of/unneeded/crap? Opendocument & part = 1' в'/page.php/welcome', а не наоборот? – Gumbo

ответ

5

В качестве параметров в запросе URL может иметь произвольный порядок, вам необходимо используйте один из RewriteCond directive для каждого параметра для проверки или для каждой возможной перестановки.

Вот пример с 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 

Чтобы определить вашу карту, написать следующую директиву в вашем сервере или Virual конфигурации хоста (эта директива не допускается в пер- контекст директории):

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] 
+0

Yikes, это довольно faff init !? Вы объяснили это очень хорошо, хотя, спасибо :) – user84643

+1

Это даже не все, что я мог вам сказать. Вы также можете использовать скрипт PHP для решения этой проблемы. И id может быть даже лучше, поскольку PHP - более сильный язык, чем mod_rewrite. Но вы попросили решение mod_rewrite. – Gumbo

0

Таким образом, вы можете использовать RedirectMatch с регулярным выражением, которое будет соответствовать полному URL-адресу, включая строку запроса. Это позволит вам переупорядочить части URL-адреса, но если вам нужно сделать такие преобразования, как «opendocument & part = 1», чтобы «приветствовать» (где новый URL-адрес полностью отличается от исходного), вам может понадобиться RewriteMap - или возможно, лучше, просто отправьте все URL-адреса на page.php и проанализируйте строку запроса в PHP.

EDIT: Если это только несколько 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 
+2

«Переадресация» работает только с URL-адресами, а не с запросом URL. – Gumbo

1

@Jack Ross

RewriteCond %{QUERY_STRING} option=com_content&task=view&id=70&Itemid=82 
RewriteRule ^index.php http://www.domain.com/business/banks/? [R=301,L] 

A? будет предотвращать отправку URL-адреса пользователю с той же строки запроса, что и исходная страница.

+0

Спасибо, это то, что я искал. – James

Смежные вопросы