web-dev-qa-db-fra.com

Redirection de raccourcisseur d'URL maison en conflit avec les redirections 301

J'ai un site Web qui a été construit à l'origine en utilisant ASP classique. Il y a environ un an, il a été réécrit en PHP. Cela a entraîné des modifications des extensions de fichiers et certaines pages ont été déplacées vers de nouveaux emplacements sur le site Web. Naturellement, nous avons effectué 301 redirections des anciennes URL vers les nouvelles URL afin que leurs utilisateurs et les moteurs de recherche puissent trouver leurs nouveaux emplacements. Cela fonctionne bien.

Nous leur avons également créé un outil qui permet au propriétaire du site de créer ses propres URL minuscules qui seront redirigées vers une page avec les variables de suivi des campagnes Google Analytics incluses dans l'URL afin de pouvoir suivre la campagne et voir ses performances.

Le problème que j'ai est que les règles de suivi de la campagne sont en conflit avec les redirections 301 et empêche les redirections de fonctionner du tout.

Voici le code de suivi de la campagne:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /tracking.php?$1 [R=301,L]

Comme vous pouvez le voir, il vérifie si un fichier existe et s'il ne le fait pas, il redirige vers un script de suivi (tracking.php) qui prend ensuite le code de suivi et redirige vers l'URL appropriée avec le code de campagne Google Analytics dans la requête. chaîne.

Ce code provoque l'échec de règles comme celle-ci:

redirect 301 /about.asp /about.php
redirect 301 /capabilities.asp /capabilities.php
redirect 301 /capacitors.asp /capacitors.php

Il est logique que cela ne fonctionne pas ensemble, car les règles de suivi indiquent: "si aucun fichier n'est trouvé, redirigez-le vers tracking.php". Ce dont j'ai besoin, c'est que les redirections 301 soient exécutées en premier. Si aucune d'entre elles ne correspond, redirigez-les ensuite vers le script de suivi. Le fait de placer les règles de suivi sous les redirections 301 ne modifie pas les résultats.

Cela peut-il être fait via .htaccess? Ou devrai-je modifier le script de suivi de sorte que, si une campagne n'est pas trouvée, elle vérifie si l'ID de campagne est en réalité une ancienne page à rediriger, puis effectue la redirection 301 à partir de là?

11
John Conde

Essayez de convertir vos redirections mod_alias en directives mod_rewrite.


Edit: L'exemple ci-dessous suppose que vous avez remplacé les anciens fichiers ASP par des fichiers PHP sous le même chemin.

RewriteEngine on

# *.asp -> *.php
RewriteRule (.*)\.asp$ /$1.php [R=301,L]

# tracking script
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /tracking.php?$1 [R=301,L]

... ou vous pouvez ignorer la variable d'expression régulière et définir une redirection explicite pour chacun des anciens URI:

RewriteRule about\.asp$ /about.php [R=301,L]
RewriteRule capabilities\.asp$ /capabilities.php [R=301,L]
RewriteRule capacitors\.asp$ /capacitors.php [R=301,L]

Edit # 2: Voici un exemple qui devrait couvrir la plupart des situations que vous rencontrerez:

RewriteEngine on

# Changes to path + Query String Append
RewriteRule ^/path/to/old\.asp$ /path/to/new/about.php [R=301,L,QSA]

# *.asp -> *.php + Query String Append
RewriteRule ^(.*)\.asp$ $1.php [R=301,L,QSA]

# tracking script
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /tracking.php?$1 [R=301,L]
5
danlefree