web-dev-qa-db-fra.com

Utilisation efficace de 301 pour les grandes cartes de redirection

EDIT: Comme demandé ci-dessous, il s'agit du jeu de règles complet pour un produit (obsolète maintenant, car je devrais pouvoir les consolider en UNE seule règle qui recherche le numéro de produit):

 RewriteRule  /mens-shirts-77/alice-in-wonderland-shirt-662.html$ http://www.domain.com/alice-in-wonderland-shirt-p160c3 [R=301]
 RewriteRule  /womens-shirts-92/womens-alice-in-wonderland-shirt-872.html$ http://www.domain.com/alice-in-wonderland-shirt-p160c3 [R=301]
 RewriteRule  /index.php?main_page=product_info*&products_id=(662|872)*$ http://www.domain.com/alice-in-wonderland-shirt-p160c3 [R=301]

Et voici la chaîne de requête d'origine vue du dessus que j'essaie de remplacer par un générique:

/index.php?main_page=product_info&cPath=77&products_id=694&hipid=63ad73f32f5159a3d0f71b7b92404591

Je souhaite regrouper les ensembles de règles à trois lignes ci-dessus en une seule ligne (l'ID de produit est toujours associé à toute forme d'URL, c'est la SEULE chose que je dois référencer à partir d'une URL entrante) ... ceci est mon premier coup d'envoi Je crois que ce ne sera pas si facile maintenant, mais vous avez l’idée:

RewriteRule  *(662|872)*$ http://www.domain.com/alice-in-wonderland-shirt-p160c3 [R=301,L]

D'après ce que je comprends maintenant, je dois écrire une regex qui prend littéralement en considération chaque caractère potentiel dans l'URL ... mais avec ce genre de surdose, il y a plus de risque de conflit ... par exemple, cette règle fonctionne pour la requête. chaîne URL, mais pas les deux autres:

RewriteRule  ^/[A-Za-z.?_=&]+[0-9]+[A-Za-z.?_=&]+(662|872)[A-Za-z.?_=&]+[A-Za-z0-9._%+-]+  http://www.domain.com/alice-in-wonderland-shirt-p160c3 [R=301,L]

Est-il donc même possible de construire un seul regex qui gérera LES DEUX formes d'URL (chaîne de requête ET réécrit) dans une formule?

Je connais assez bien regex pour créer quelque chose, mais je ne suis pas assez familier pour comprendre la bonne et la mauvaise façon de faire les choses ... c'est pour une longue histoire Migration du référencement vers une nouvelle plate-forme ... Je dois obtenir cette expression est juste, et idéalement consolidée jusqu'à sa forme la plus minimale (il y a 300 URL avec plusieurs versions entrantes qui doivent être comptabilisées, comme indiqué ci-dessus) ... Je ne pense pas que je devrais avoir 1000 règles htaccess sur un graphique déjà site de commerce électronique lourd. : /

Merci d’avoir jeté un coup d’œil ... j’ai vraiment besoin que ce soit bien la première fois!

2
JacksonJJ

Je vois des expressions rationnelles étranges qui semblent plus complexes que nécessaire ... par exemple, pourquoi utiliser (.*) au lieu d'un simple * ???

Parce que dans les expressions régulières (par opposition à des motifs globbing /caractères génériques standard), le * (astérisque) en soi ne veut rien dire. Le * répète l'élément précédent au moins 0 fois. Par exemple, la regex A* correspondra à rien , "A", "AA" ou "AAA", etc.

Dans votre exemple *(662|872)*$, le premier * n'a pas de sens, il pourrait même en résulter une erreur! Le second * répète ensuite l'élément précédent ("662" ou "872") zéro ou plusieurs fois. Donc, cela va correspondre à "" (une chaîne vide), "662", "872", "662662" ou "662872", etc.

En fait, la regex dont vous avez besoin est probablement beaucoup plus simple (et non complexe). Par exemple, (662|882) correspondra à "662" ou "882" n'importe où dans la chaîne.

Cependant, si vous devez faire correspondre les chaînes de requête et les chemins d'URL, cela ajoutera de la complexité, car vous ne pouvez pas le faire avec un seul RewriteRule. Vous ne pouvez pas faire correspondre la chaîne de requête à la directive RewriteRule. Vous devez faire quelque chose comme ce qui suit:

RewriteCond %{QUERY_STRING} products_id=(662|872) [OR]
RewriteCond %{REQUEST_URI} -(662|872)\.
RewriteRule ^ /alice-in-wonderland-shirt-p160c3 [R=301,L]

Cela suppose que vous redirigiez vers le même domaine, sinon vous aurez évidemment besoin de l'URL absolue dans la substitution RewriteRule.

Est-il même possible de créer une seule expression rationnelle qui gérera LES DEUX formes d'URL (chaîne de requête ET réécrite) dans une formule?

Une seule directive mod_rewrite - no.

Cependant, avez-vous vraiment besoin de faire correspondre la chaîne de requête et le chemin de l'URL? Vous dites que l'on est "réécrit". Les utilisateurs accèdent-ils au site avec les deux URL? Si l'URL a déjà été canonisée, cela pourrait effectivement être simplifié, car vous pouvez simplement ignorer la version de la chaîne de requête. Ainsi:

RewriteRule -(662|872)\. /alice-in-wonderland-shirt-p160c3 [R=301,L]

(Les bits supplémentaires de l’expression rationnelle servent uniquement à s’assurer qu’ils ne correspondent en aucun endroit de l’URL. Si vous êtes certain que "662" ou "872" ne peut pas figurer ailleurs dans l'URL ou une partie d'un autre produit id , ils peuvent alors être supprimés.)

0
MrWhite