Простой mod_rewrite RewriteRule для грязных устаревших URL-адресов
-
12-11-2019 - |
Вопрос
Запуск нового веб-сайта для нового клиента.На их старом сайте представлено около 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]
.
Примечания:
-
в контексте per-dir (.htaccess), префикс per-dir раздевается, поэтому вы не можете запустить шаблон
RewriteRule
с^/
. -
Вы должны использовать
RewriteCond
, чтобы соответствовать строке запроса. -
Как указано в другом ответе, решение
RewriteMap
может быть подходит для этой ситуации, если у вас есть доступ к HTTPD.conf / Vhost Contitay для этого сайта.Я не уверен, что работает с строками запросов, хотя. -
Для чего-то вроде этого может быть лучшее решение переписать все эти URL-адреса к скрипту бокового сервера и использовать скрипт для выполнения HTTP Redirect для каждого URL.