Problème de compatibilité lors de la migration vers Internet Explorer 8 (ou plus) : le cas du user-agent
Lors de la migration vers une nouvelle version d'Internet Explorer, il y a parfois, comme lors des migrations d'OS, des problèmes de compatibilités au niveau des applications Web.
Une des causes possibles aux problèmes de compatibilité IE 6 / IE 8 peut être la vérification par l'application Web de la chaine user-agent.
En effet, certains codes (compilés ou non) testent la présence de MSIE+60 dans cs (user-Agent) et font un Exit s'ils ne le trouvent pas, ce qui est le cas si la version d'Internet Explorer est la 7 ou ultérieure.
Si en plus on ne dispose plus des sources ou des compétences nécessaires pour modifier le code, comment faire pour qu'un navigateur récent (ayant donc un user-agent classique type Mozilla/4.0+(compatible;....)) puisse se présenter comme étant un "IE6" auprès de l'application Web ?
L'objectif de ce billet est de vous éclairer les idées sur ce sujet !
Partie 1 - Petits rappels sur le user-agent
Quand un internaute visite une page web, une chaîne de type texte est généralement envoyée au serveur pour identifier l'application cliente de l'utilisateur. Elle est incluse dans la requête HTTP via l'entête « User-Agent » et elle donne des informations comme par exemple : le nom de l'application, la version, le système d'exploitation, la langue, etc...
Un des exemples les plus anciens est celui d'Internet Explorer qui utilise une chaîne User-Agent commençant par « Mozilla/<version> (compatible; MSIE<version>... », afin de pouvoir recevoir le contenu destiné à Netscape Navigator, son rival de l'époque (on parle ici des années 90 ce qui ne nous rajeuni pas). Il ne s'agissait pas d'une référence au navigateur Mozilla, développé beaucoup plus tard, mais au nom de code original pour le navigateur, qui était également le nom de la mascotte de la société Netscape (plus d'informations à ce sujet ici )
A quoi ressemble une chaine user-agent ?
Prenons un exemple simplifié : la chaine d’un IE 8 présent par défaut dans Windows 7 :
Dans la réalité, la chaine du user-agent est généralement un peu plus complexe car elle va contenir des informations complémentaires sur certaines applications ou composants additionnels installés sur le poste. Par exemple sur mon poste de travail, la chaine est la suivante :
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3; MS-RTC LM 8)
Ce qui permet aux applications Web traitant cette chaine de savoir que mon poste :
– est une version 64 bit de Windows 7 grâce à la présence de WOW64 (Windows-On-Windows 64–bit) qui signifie que j’exécute une version 32 bit d’Internet Explorer sur un processeur 64 bit et de NT 6.1 qui indique que c’est un Windows 7
– utilise le moteur de rendu Trident 4.0 (Trident/4.0) qui est le moteur de rendu le plus standard (et celui par défaut) d’IE 8
– dispose des frameworks .NET 2.0 ( .NET CLR 2.0.50727), .NET 3.0 ( .NET CLR 3.0.30729) et 3.5 ( .NET CLR 3.5.30729)
– à l’application Microsoft Livemeeting installée (MS-RTC LM 8)
– etc…
Sur cette même machine, le user-agent d’un Firefox 3.6 US est le suivant :
Et celui d’un Google Chrome 4.1 est le suivant :
Ressources complémentaires :
Understanding User-Agent Strings
http://msdn.microsoft.com/en-us/library/ms537503.aspxHistory of the user-agent string
http://www.nczonline.net/blog/2010/01/12/history-of-the-user-agent-string/User Agent String explained
http://www.useragentstring.com/The Internet Explorer 8 User-Agent String (Updated Edition)
http://blogs.msdn.com/ie/archive/2009/01/09/the-internet-explorer-8-user-agent-string-updated-edition.aspxIntroducing IE9’s User Agent String
http://blogs.msdn.com/ie/archive/2010/03/23/introducing-ie9-s-user-agent-string.aspx
Partie 2 - Comment visualiser votre user-agent ?
Dans votre navigateur, dans la barre d'adresse tapez la commande suivante : javascript:alert(navigator.userAgent)
Il est également possible d’utiliser des petits outils tiers ou des services Web en ligne tels que fiddlertool
Outil de tests du User-agent
http://www.fiddlertool.com/ua.aspx
Partie 3 - Comment un user-agent peut être testé dans une application Web ?
Là, il existe diverses méthodes (et différentes implémentations en fonction des langages utilisés) et l’objet de ce billet n’est pas d’expliquer comment tester le user-agent mais plutôt comment gérer les cas où le test pose problème car il réduit le spectre des versions supportées à IE 6 par exemple.
Cependant, si vous avez à reprendre ce type de code, cela peut être l’occasion de revoir un peu la façon dont la détection est faite.
Donc voici quelques lectures intéressantes sur le sujet (avec pour certaines des exemples à réutiliser) :
User-Agent String and Version Vector
http://www.microsoft.com/windows/internet-explorer/readiness/developers-existing.aspx#useragentDetermining Browser Capabilities in ASP.NET
http://msdn.microsoft.com/fr-fr/magazine/cc300549(en-us).aspxDetecting Internet Explorer More Effectively
http://msdn.microsoft.com/en-us/library/ms537509.aspxFeature detection is not browser detection
http://www.nczonline.net/blog/2009/12/29/feature-detection-is-not-browser-detection/
Partie 4 - comment changer le user-agent de votre navigateur IE 8 ?
Option 1 : via changement dans le Registre
La méthode la plus barbare (ou plutôt la moins industrielle) qui consiste soit à modifier quelques valeurs dans quelques clés de manière très manuelle (via l’éditeur du Registre) soit via un fichier .reg (utilisable aussi dans un script)
Sur le site http://www.fiddlertool.com/ua.aspx vous trouverez un ensemble de fichiers .reg permettant de modifier ces paramètres dans le Registre.
Par exemple celui qui paramètre le user-agent pour faire ressembler à un IE 6 sur Windows XP :
Et pour revenir aux paramètres antérieurs, il y a un script “Undo User-Agent registry overrides”.
A noter : tout changement du paramètre nécessite un redémarrage d’Internet Explorer pour la prise en compte des modifications.
Option 2 : via les stratégies (locale ou de groupe d’Active Directory) en redéfinissant l’ensemble de la chaine user-agent
Dans la partie Utilisateur de la stratégie dans l’arborescence suivante :
User configuration —> Windows Settings —> Internet Explorer Maintenance —> Connection —> User Agent String
Exemple : modification du user-agent pour qu’il soit le même qu’un Internet Explorer 6 sous Windows XP avec le .NET Framework 1.1
Option 3 : via les stratégies (local ou de groupe d’Active Directory) en modifiant juste la version d’IE présentée dans la chaine user-agent
Dans partie Ordinateur (s’applique donc à tous les utilisateurs de la machine), il est possible de définir la version d’Internet Explorer qui sera exposée dans la chaine User-agent
A noter : le fait de configurer IE 8 en mode compatibilité IE 7.0 va aussi modifier le user-agent renvoyé par le navigateur (MSIE 7.0 à la place de MSIE 8.0 dans le user-agent)
Ressources complémentaires :
IEAK - Customizing the Browser - Compatibility view :
http://technet.microsoft.com/en-us/library/cc817403.asp
Option 4 : via des outils complémentaires
Si votre version d’Internet Explorer est la version 7 et que votre application ne supporte que la chaine présentée par Internet Explorer 6.0, il existe un outil Microsoft pour ça :-)
Microsoft User Agent String Utility version 2
http://www.microsoft.com/downloads/details.aspx?FamilyID=9517DB9C-3C0D-47FE-BD04-FAD82A9AAC9F&displaylang=en
"A utility that opens an Internet Explorer 7.0 window that is configured to report its identity to websites as being Internet Explorer 6.0."
Malheureusement, il n’existe pas chez Microsoft d’équivalent (à ma connaissance) pour Internet Explorer 8 :-(
Donc on doit se tourner vers des outils tiers (et pas forcément payant) comme celui-ci : Bayden UAPicktéléchargeable sur http://www.enhanceie.com/ua.aspx et recommandé par des membres de l’équipe IE de Redmond.
UAPick est assez intéressant car il permet de changer de user-agent sans pour autant redémarrer IE 8 ce qui est quand même plus souple (bon maintenant, pour un utilisateur final en entreprise ce n’est pas forcément la meilleure option).
Dans l’usage ça fonctionne de la manière suivante :
Important : pensez à sauvegarder dans un fichier Texte votre user-agent string actuelle avant de tester l’outil.
Une fois l’add-on IE installé, dans le menu Outils, on clique sur set UA String
Puis on peux sélectionner dans le menu un des modèles standards proposés (exemple : IE 6 sur XP)
On clique sur save Changes.
et on peut rafraichir la page pour vérifier le changement effectif de la chaine user-agent
Voilà, j’espère que cet article vous aidera dans votre migration vers IE 8 et plus.
Comme d’habitude, vous pouvez me laisser vos commentaires via la page de contact : http://blogs.msdn.com/iefrance/contact.aspx
– Stanislas Quastana –