Réécriture simple mod_rewrite pour URL hérité désordonnée
-
12-11-2019 - |
Question
Lancement d'un nouveau site Web pour un nouveau client. Leur ancien site a environ 50 produits et malheureusement, les anciens noms de produits ne correspondent pas au nouveau modèle URL
Anciens exemples d'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
(Les anciennes URL frappent parfois plus de 150 caractères.)
Nouvelles URL:
example.com/products/category/actual-product-name
Il n'y a pas de modèle de jeu et reconnaissable pour passer de l'ancien nom du produit au nouveau. Il y a pour la catégorie.
J'ai essayé des redirections simples Mod_alias, mais je comprends que j'ai besoin d'une réécriture à la place. Mais j'ai des problèmes. Tout ce dont j'ai besoin, c'est d'une redirection de 1 à 1 pour chacune de ces 50 URL. Je pensais que je pouvais faire quelque chose comme:
RewriteRule ^/products.aspx?category=Foo&product=ProductName
/products/category/new-product-name/ [R=301,NC]
Mais cela ne fonctionne pas. Je sais que cela devrait être simple, mais je suis coincé. Des idées?
La solution
Utilisez le motif ci-dessous pour le reste de vos URL de redirection. Notez que vous échappez aux caractères spéciaux, par exemple ?
, .
et l'espace en ajoutant un
\
devant eux
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]
Autres conseils
Jetez un œil au RewriteMap
directive de mod_rewrite
.
Vous pouvez spécifier dans un fichier texte quelque chose comme:
products.aspx?category=Foo&product=SuperLongNoBreakProductNameIDDescription /products/category/new-product-name
Et dans votre httpd.conf
RewriteMap productmap /path/to/map/file.txt
RewriteRule ^(.*) ${productmap:$1} [R=301,NC]
Conseil: s'il s'agit d'une redirection permanente que vous souhaitez, assurez-vous de définir un approprié Cache-Control
et Expires
En-tête pour instruire les navigateurs pour mettre en cache le 301.
Vous pouvez essayer quelque chose comme ceci:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^category=Foo&product=ProductName$
RewriteRule ^products\.aspx$ /products/category/new-product-name/? [R=301,L]
Remarques:
Dans le contexte par-dir (.htaccess), le préfixe par-dir est supprimé, vous ne pouvez donc pas démarrer le
RewriteRule
motif avec^/
.Vous devez utiliser
RewriteCond
pour correspondre à la chaîne de requête.Comme indiqué dans une autre réponse, un
RewriteMap
La solution peut être adaptée à cette situation, si vous avez accès à httpd.conf / la définition VHOST de ce site. Je ne sais pas comment cela fonctionne avec les chaînes de requête.Pour quelque chose comme ça, il pourrait s'agir d'une meilleure solution pour réécrire toutes ces URL vers un script côté serveur, et utiliser le script pour effectuer la redirection HTTP pour chaque URL.