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

StackOverflow https://stackoverflow.com/questions/8975621

Вопрос

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

Но это не работает.Я знаю, что это должно быть просто, но я застрял.Есть какие-нибудь идеи?

Это было полезно?

Решение

Используйте приведенный ниже шаблон для остальных ваших 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 Contitay для этого сайта.Я не уверен, что работает с строками запросов, хотя.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top