1 votes

Apache2 - réécriture d'un ensemble d'URLs avec des noms de chemins spécifiques en une seule URL.

J'ai besoin de réécrire un certain nombre d'urls (une centaine environ) à des fins de référencement, et il se peut que d'autres soient ajoutées à l'avenir (probablement 50-100 autres plus tard). J'ai besoin d'un moyen flexible de le faire et jusqu'à présent, le seul moyen auquel je pense est de modifier le fichier .htaccess en utilisant le moteur de réécriture.

Par exemple, j'ai un tas d'urls comme celui-ci (veuillez noter que la chaîne de requête n'est pas pertinente et est dynamique ; elle peut être n'importe quoi. Je ne les utilisais qu'à titre d'exemple. Je me concentre uniquement sur le nom de chemin - la partie entre le nom d'hôte et la chaîne de requête, comme indiqué en gras ci-dessous) :

http://example.com/ seo_term1 ?utm_source=google&utm_medium=cpc&utm_campaign=seo_term http://example.com/ un autre_seo_term2 ?utm_source=facebook&utm_medium=cpc&utm_campaign=seo_term

http://example.com/ encore_un_autre_seo_term3 ?utm_source=exemple_ad_network&utm_medium=cpc&utm_campaign=seo_term http://example.com/ foobar_seo_term4

http://example.com/ blah_seo_term5 ?test=1

etc...

Et ils sont tous en train d'être réécrits pour (pour l'instant) : http://example.com/

Quelle est la manière la plus efficace de procéder pour que je puisse ajouter d'autres termes à l'avenir ?

Une solution que j'ai trouvée consiste à faire ceci (dans le fichier .htaccess) :

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ / [NC,QSA]

Cependant, le problème avec cette solution est que même les urls invalides (telles que http://example.com/blah ) sera réécrit en http://example.com au lieu de donner un code 404 (ce qu'il est censé faire de toute façon). J'essaie toujours de comprendre comment tout cela fonctionne, et la seule façon à laquelle je peux penser est d'écrire 100 pages de plus. RewriteCond (par exemple : RewriteCond %{REQUEST_URI} =/seo_term1 [NC,OR] ) avant le RewriteRule directive. Par exemple :

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} =/seo_term1 [NC,OR]
RewriteCond %{REQUEST_URI} =/another_seo_term2 [NC,OR]
RewriteCond %{REQUEST_URI} =/yet_another_seo_term3 [NC,OR]
RewriteCond %{REQUEST_URI} =/foobar_seo_term4 [NC,OR]
RewriteCond %{REQUEST_URI} =/blah_seo_term5 [NC]
RewriteRule ^(.*)$ / [NC,QSA]

Mais ça ne me semble pas très efficace. Existe-t-il un meilleur moyen ?

3voto

Brad Points 3206

La première amélioration que vous pouvez faire est que vous n'avez pas besoin de la RewriteCond lignes du tout.

RewriteRule /seo_term1 / [NC,QSA]

Fait exactement ce que vos deux lignes font maintenant.

La deuxième amélioration que vous pourriez apporter est d'utiliser un RewriteMap . La carte de réécriture elle-même peut être mise à jour sans redémarrer Apache.

RewriteMap seo txt:/etc/apache2/maps/seo.txt
RewriteRule (.*) ${seo:$1} [NC,QSA]

et seo.txt contient

/seo_term1 /
/seo_term2 /

Note : Je n'ai pas utilisé de RewriteMap depuis plusieurs années. La configuration ci-dessus peut nécessiter quelques ajustements en raison de ma mémoire imparfaite.

1voto

Ben Lessani Points 5146

Une expression rationnelle devrait être capable de le faire.

RewriteEngine on
RewriteCond %{REQUEST_URI} ^\/[^\?]+\?(?=.*(utm_source\=(google|msn|yahoo)))(?=.*(utm_medium\=(cpc|ppc)))(?=.*(utm_campaign\=[a-zA-Z0-9._-]+))
RewriteRule ^(.*)$ / [L,R=301]

L'exemple ci-dessus ne correspondrait qu'à une chaîne contenant tous les paramètres spécifiés, sans tenir compte de la chaîne de tête (pré ?).

Editer ...

Ok, vous avez un peu changé votre question maintenant. Mais heureusement, c'est encore plus simple.

RewriteEngine on
RewriteCond %{REQUEST_URI} ^\/(seo_term1|seo_term2)(.*)?
RewriteRule ^(.*)$ / [L,R=301]

Il suffit de changer/modifier/ajouter des valeurs si nécessaire.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X