Cette après-midi, j’ai pu découvrir un nouveau bug étrange dans Internet Explorer (oui, encore lui). J’ai pu remarquer qu’une requête POST via XMLHttpRequest échouait systématiquement (serveur Apache 2.2 et 2.4) avec le message suivant quand le serveur utilisait un certificat SSL:
XMLHttpRequest: Erreur réseau 0x2ef3, Impossible d’effectuer l’opération à cause de l’erreur suivante 00002ef3.
Nb: Les changements suivants ont été effectués sur un Apache 2.2 et 2.4 tournant sur respectivement Debian 7 et 8.
Après quelques recherches, je me suis rendu compte qu’Internet Explorer ne tolère qu’un KeepAlive de 60 secondes. Un keepalive inférieur entraîne un échec des requêtes après le délai de timeout (5 secondes par défaut sur Apache).
La solution pour fixer ce bug est donc de soit désactiver le KeepAlive ou alors de l’augmenter au-dessus de 60 secondes (à gérer au cas par cas).
Le KeepAlive, c’est quoi ?
Quand vous surfez sur un site web, vous allez chercher plusieurs fichiers sur le même serveur (le site, les images, le css,…).
Afin d’éviter d’ouvrir et de fermer une nouvelle connexion pour chaque requête, votre navigateur peut garder une connexion réseau temporairement ouverte (dite persistante) et l’utiliser pour faire passer l’entièreté de ses requêtes dedans, d’une traite, sans interruption donc. Il va de soit que ne pas devoir ouvrir et fermer une nouvelle connexion améliore les performances de chargement de la page, uniquement si celle-ci dispose de nombreux fichiers différents à charger. Cela permet de ne pas renégocier la partie TCP de la connexion client/serveur.
Comment le désactiver sous apache ?
C’est très simple, éditez le fichier
apache2.confet remplacez la ligne
KeepAlive On
par
KeepAlive Off
Nb: ce paramètre se trouve à la ligne 92 dans mon cas.
Comment incrémenter la valeur ?
De nouveau dans
apache2.conf, éditez la ligne suivante:
KeepAliveTimeout 5
et changez le 5 par le nombre de secondes voulu (au delà de 60 pour régler le soucis sous IE)
KeepAliveTimeout 70
Conseils: Internet Explorer intègre aussi un débogueur/inspecteur
Pour cela, appuyez sur F12 et l’inspecteur s’ouvrira.
Il permet par exemple de simuler les plus vieilles versions d’IE, en spécifiant le moteur de rendu, c’est toujours utile pour un développeur web 🙂
D’ailleurs on peut se rendre compte que dans la liste des moteurs de rendus disponibles se trouve une valeur nommée Edge. Un nom équivoque: s’agit-il du successeur d’Internet Explorer qui arrivera avec la sortie de Windows 10? Dans ce cas, le nom de ce successeur était alors connu depuis longtemps, ou s’agit t-il du nom attribué au dernier moteur de rendu disponible avec ses patches? La question est lancée, si un employé de Microsoft lit ce blog (espérons 😉 ).
Merci pour l’astuce, j’ai gagné une après midi de recherche 🙂
Merci beaucoup pour l’astuce, je me voyais déjà m’arracher les cheveux avec ce truc 😉