Простой 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]

Заметки:

  1. В контексте per-dir (.htaccess) префикс per-dir удаляется, поэтому вы не можете запустить RewriteRule шаблон с ^/,

  2. Вы должны использовать RewriteCond сопоставить со строкой запроса.

  3. Как указано в другом ответе, RewriteMap Решение может подойти для этой ситуации, если у вас есть доступ к httpd.conf / определению vhost для этого сайта. Я не уверен, как это работает со строками запроса.

  4. Для чего-то подобного это может быть лучшим решением переписать все эти URL-адреса в сценарий на стороне сервера и использовать сценарий для перенаправления HTTP для каждого URL-адреса.

Другие вопросы по тегам