Простой mod_rewrite RewriteRule для грязных устаревших URL - PullRequest
0 голосов
/ 23 января 2012

Запуск нового сайта для нового клиента.Их старый сайт насчитывает около 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 ]

1 голос
/ 23 января 2012

Используйте шаблон ниже для остальных ваших 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]
0 голосов
/ 23 января 2012

Вы можете попробовать что-то вроде этого:

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-адреса.

0 голосов
/ 23 января 2012

Посмотрите директиву 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.

...