Comment redirect l’URL source avec la chaîne de requête en utilisant redirectmap dans Apache

Je dois migrer mes anciennes URL de site (se terminant par .aspx / asp et il y en a quelques centaines) vers un nouveau site (se terminant par .jsp / servlets). Nous avons choisi d’utiliser RedirectMap et RedirectRule pour implémenter cette migration dans Apache. Les URL simples fonctionnent bien. Mais la sensibilité à la casse dans l’URL source provoque le redirection vers un PAGENOTFOUND (par exemple, /magazine/Magazine.aspx?Id=4 est redirigé vers PAGENOTFOUND au lieu de http://mydomain.com/advice/beauty ).

Un autre problème est qu’il est impossible de redirect les URL source avec une chaîne de requête (par exemple, /Help/Help.aspx?HelpID=6 est redirigé vers PAGENOTFOUND au lieu de http://mydomain.com/services/essential-info). ).

Veuillez trouver un exemple de fichier texte de redirection suivant.

 /100001/Product.aspx http://mydomain.com/urlredirect/p100003 /100002/Product.aspx http://mydomain.com/urlredirect/p100005 /Help/Help.aspx?HelpID=6 http://mydomain.com/services/essential-info /Help/Help.aspx?HelpID=11 http://mydomain.com/services/info-about-delivery-methods /Magazine/Feature.asp?Id=816 http://mydomain.com/advice/all-about-you.asp /Magazine/Magazine.aspx?Id=4 http://mydomain.com/advice/beauty /Advive/all-about-you.asp http://mydomain.com/advice/beauty-in-you 

Code de redirection écrit dans Apache

 RewriteEngine on RewriteMap text2id txt:/opt/webserver/apache/conf/redirectmap.txt RewriteRule ^(.*\.(aspx|asp)) ${text2id:$1} [NC,R=301,L] 

La réponse de Jon Lin m’a aidé à rechercher la bonne redirection sur la carte. Nous avons mis à jour le code comme ci-dessous.

Ci-dessous le code de redirection implémenté.

 RewriteEngine on RewriteMap text2id txt:/opt/webserver/apache/conf/redirectmap.txt # Base URL Does have a QS RewriteCond %{REQUEST_URI} ^(.*\.(aspx|asp).*) RewriteCond ${text2id:%1?%{QUERY_STRING}} ^(.*\?.*)$ RewriteRule ^.*$ %1 [R=301,L] # Base URL exists in the map RewriteCond %{REQUEST_URI} ^(.*\.(aspx|asp).*) RewriteRule ^.*$ ${text2id:%1|PAGENOTFOUND} [R=301,L] 

Vous ne serez pas en mesure de faire correspondre la chaîne de requête comme ça.

Dans votre règle:

 RewriteRule ^(.*\.(aspx|asp)) ${text2id:$1} [NC,R=301,L] 

La seule chose envoyée à la carte de réécriture est le chemin URI, pas la chaîne de requête. Vous devez également transmettre la chaîne de requête à la carte de réécriture:

 RewriteRule ^(.*\.(aspx|asp)) ${text2id:$1?%{QUERY_STRING}} [NC,R=301,L] 

Si cela ne fonctionne pas pour vous, essayez de doubler le pourcentage devant votre QUERY_STRING

En tant qu’informations supplémentaires, mon collègue et moi avons eu du mal à faire correspondre QUERY_STRING dans un fichier de carte de redirection pendant la majeure partie de la journée. Nous exécutons Helicon sous Windows, donc nous ne soaps pas si cela a quelque chose à voir avec notre solution qui est subtilement différente de celle ci-dessus, mais nous avons pensé que cela pourrait aider quelqu’un d’autre dans notre situation …

Notre problème est que le RewriteRule ci-dessus ne analysait pas correctement le QUERY_STRING dans notre environnement. L’URL résultante est apparue avec des caractères encodés en URL et le mot QUERY_STRING (comme% 7bQUERY_STRING% 7d).

Pour toute référence à QUERY_STRING dans la chaîne de recherche de réécriture de carte, nous avons dû échapper à la variable d’environnement de chaîne de requête. Par exemple, dans notre fichier httpd.conf, la réponse ci-dessus (merci pour la réponse en passant) a fini par ressembler à ceci:

 RewriteRule ^(.*\.(aspx|asp)) ${text2id:$1?%%{QUERY_STRING}} [NC,R=301,L] 

Notez que la variable d’environnement QUERY_STRING est précédée d’un signe de pourcentage double (%%) plutôt que d’un seul. C’est la seule façon d’obtenir que le moteur parsing la chaîne de requête nestede dans la référence de réécriture de carte. Cela était également vrai pour RewriteCond dans notre environnement.

Cela peut ne pas s’appliquer à tout le monde, mais si vous voyez votre URL de redirection contenir quelque chose comme% 7bQUERY_STRING% 7d, alors vous voudrez peut-être essayer. Cela peut vous faire économiser des heures de douleur.

Meilleur, Brandon