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?

Était-ce utile?

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:

  1. Dans le contexte par-dir (.htaccess), le préfixe par-dir est supprimé, vous ne pouvez donc pas démarrer le RewriteRule motif avec ^/.

  2. Vous devez utiliser RewriteCond pour correspondre à la chaîne de requête.

  3. 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.

  4. 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top