Простой mod_rewrite RewriteRule для грязных устаревших URL
Запуск нового сайта для нового клиента. Их старый сайт насчитывает около 50 продуктов, и, к сожалению, старые названия продуктов не соответствуют новому шаблону URL
Примеры старых URL:
example.com/products.aspx?category=Foo&product=SuperLongNoBreakProductNameIDDescription
example.com/products.aspx?category=Foo&product=ProductNameDescription&var1=1293.123
example.com/products.aspx?category=Bar&product=ProductCategoryProdNameRandomNumbers
(Старые URL иногда содержат более 150 символов.)
Новые URL:
example.com/products/category/actual-product-name
Не существует определенного, узнаваемого шаблона перехода от старого названия продукта к новому. Существует для категории.
Я пробовал простые перенаправления mod_alias, но понимаю, что мне нужен RewriteRule. Но у меня проблемы. Все, что мне нужно, это перенаправление 1-к-1 для каждого из этих 50 URL. Я думал, что могу сделать что-то вроде:
RewriteRule ^/products.aspx?category=Foo&product=ProductName
/products/category/new-product-name/ [R=301,NC]
Но это не работает. Я знаю, что это должно быть просто, но я застрял. Есть идеи?
3 ответа
Используйте шаблон ниже для остальных ваших URL перенаправления. Обратите внимание, что вы избегаете специальных символов, например ?
, .
и пространство добавив
\
перед ними
RewriteEngine on
RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /products\.aspx\?category=Foo&product=SuperLongNoBreakProductNameIDDescription [NC]
RewriteRule ^ /products/category/new-product-name/ [R=301,NC]
Посмотрите на RewriteMap
директива mod_rewrite
,
Вы можете указать в текстовом файле что-то вроде:
products.aspx?category=Foo&product=SuperLongNoBreakProductNameIDDescription /products/category/new-product-name
И в твоем httpd.conf
RewriteMap productmap /path/to/map/file.txt
RewriteRule ^(.*) ${productmap:$1} [R=301,NC]
Подсказка: если вы хотите перманентное перенаправление, установите соответствующий Cache-Control
а также Expires
заголовок для инструктирования браузеров для кэширования 301.
Вы можете попробовать что-то вроде этого:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^category=Foo&product=ProductName$
RewriteRule ^products\.aspx$ /products/category/new-product-name/? [R=301,L]
Заметки:
В контексте per-dir (.htaccess) префикс per-dir удаляется, поэтому вы не можете запустить
RewriteRule
шаблон с^/
,Вы должны использовать
RewriteCond
сопоставить со строкой запроса.Как указано в другом ответе,
RewriteMap
Решение может подойти для этой ситуации, если у вас есть доступ к httpd.conf / определению vhost для этого сайта. Я не уверен, как это работает со строками запроса.Для чего-то подобного это может быть лучшим решением переписать все эти URL-адреса в сценарий на стороне сервера и использовать сценарий для перенаправления HTTP для каждого URL-адреса.