web-dev-qa-db-fra.com

Ignorer le mode de compatibilité intranet IE8

Par défaut, IE8 force les sites Web intranet en mode de compatibilité. J'ai essayé de changer l'en-tête méta à IE8, mais il ne reconnaît pas l'en-tête méta et utilise simplement le paramètre du navigateur. Est-ce que quelqu'un sait comment désactiver cela?

200
sanpall

Il est possible de remplacer le mode de compatibilité dans l'intranet.

Pour IIS, ajoutez simplement le code ci-dessous à web.config. Travaillé pour moi avec IE9.

<system.webServer>
  <httpProtocol>
    <customHeaders>
      <clear />
      <add name="X-UA-Compatible" value="IE=Edge" />
    </customHeaders>
  </httpProtocol>
</system.webServer> 

Équivalent pour Apache:

Header set X-UA-Compatible: IE=Edge

Et pour nginx:

add_header "X-UA-Compatible" "IE=Edge";

Et pour express.js:

res.set('X-UA-Compatible', 'IE=Edge')
224
Andras Csehi

Michael Irigoyen a raison MAIS c'est un peu plus compliqué ...

si vous utilisez le magnifique passe-partout de Paul Irish, vous obtiendrez quelque chose comme:

<!doctype html>
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
<!--[if IE 7]>    <html class="no-js ie7 oldie" lang="en"> <![endif]-->
<!--[if IE 8]>    <html class="no-js ie8 oldie" lang="en"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">

Cela NE fonctionnera PAS comme prévu et forcera IE en mode de compatibilité dans un environnement Intranet si vous avez le "Afficher les sites intranet dans vue de compatibilité "cochée. Vous devez supprimer les commentaires conditionnels IE pour empêcher le mode de compatibilité Intranet.

Donc, le code suivant fonctionnera:

<!doctype html>
<html class="no-js" lang="en">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">

Fondamentalement, si vous déclenchez des commentaires conditionnels IE avant l'instruction <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">, vous serez forcé en mode de compatibilité dans un intranet environnement si vous exécutez IE9 avec les paramètres par défaut.

UPDATE - INFORMATIONS SUPPLÉMENTAIRES: Mais notez qu'il existe un truc qui fera fonctionner le bouilloteur HTML5:

Ajoutez un commentaire conditionnel vide avant le DOCTYPE. Et notez également que lorsque vous faites cela , vous pouvez également ajouter des commentaires conditionnels autour de la directive X-UA-Compatible , rendant ainsi la page HTML5-valide. Donc par exemple:

<!--[if HTML5]><![endif]-->
<!doctype html>
<!--[if the boilerplate conditionals goes here<![endif]-->
<head>
<!--[if !HTML5]>
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<![endif]-->

Un article de blog inspiré de la première partie de cette réponse , contient plus de détails. Et en passant: Comme mentionné dans cet article de blog, on peut également remplacer le commentaire conditionnel précédant DOCTYPE par un semi conditionnel commentaire avec aucune condition : <!--[]-->. Ainsi, comme si:

<!--[]-->
<!doctype html>
<!--[if the boilerplate conditionals goes here<![endif]-->
<head>
<!--[if !HTML5]>
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<![endif]-->

Mais notez que la dernière variante (<--[]--><!DOCTYPE html>) va, comme expliqué par exemple par cette réponse à une autre question , activer le problème bien connu qui - pour les versions héritées IE sans support pour le X-UA-Compatioble (lire: pour IE7 et IE6) - place le navigateur en mode quirks.

84
Andrew

Si vous déroulez le menu "Outils" et choisissez "Paramètres d'affichage de compatibilité", un paramètre "Afficher les sites intranet en mode de compatibilité" est affiché dans la partie inférieure de cette boîte de dialogue. Si vous décochez cette case, cela devrait résoudre le problème et IE utilisera le mode basé sur DOCTYPE.

34
PilotBob

Il y a une certaine confusion dans les réponses à cette question.

La réponse principale est actuellement une solution côté serveur qui définit un indicateur dans l'en-tête http et certains commentaires indiquent qu'une solution utilisant une balise méta ne fonctionne tout simplement pas.

Je pense que cette entrée de blog donne un bon aperçu de la façon d'utiliser les méta-informations de compatibilité et, selon mon expérience, fonctionne comme suit: http://blogs.msdn.com/b/cjacks/archive/2012/02/29/ using-x-ua-compatible-to-create-durable-entreprise-web-applications.aspx

Les points principaux:

  • définir les informations à l'aide d'une balise meta et dans l'en-tête, les deux fonctionnent
  • La méta-tag a priorité sur l'en-tête
  • La méta-balise doit être la première balise, afin de s'assurer que le navigateur ne détermine pas le moteur de rendu auparavant à l'aide d'heuristiques

Un point important (et je pense que cela crée beaucoup de confusion) est que IE a deux "classes" de modes:

  1. Le mode document
  2. Le mode navigateur

Le mode document détermine le moteur de rendu (comment est rendue la page Web).

Le mode Navigateur détermine la chaîne IE User-Agent (UA) User-Agent (UA) envoyée aux serveurs, le mode Document IE par défaut et la manière dont IE évalue les commentaires conditionnels.

Pour plus d’informations sur les modes document et navigateur, consultez cet article: http://blogs.msdn.com/b/ie/archive/2010/06/16/ie-s-compatibility- features-for-site-developers.aspx? Redirected = true

D'après mon expérience, les métadonnées de compatibilité n'influenceront que le mode document . Donc, si vous comptez sur la détection du navigateur, cela ne vous aidera pas. Mais si vous utilisez la détection de fonctionnalités, cela devrait être la voie à suivre.

Donc, je recommanderais d'utiliser la balise meta (dans la page html) en utilisant cette syntaxe:

<meta http-equiv="X-UA-Compatible" content="IE=9,10" ></meta>

Avis: donnez une liste des modes de navigateur que vous avez testés.

Le billet de blog conseille également contre l'utilisation d'EmulateIEX. Voici une citation:

Cela étant dit, une chose que je trouve étrange est lorsqu'une application demande EmulateIE7 ou EmulateIE8. Ces modes d'émulation sont eux-mêmes des décisions. Donc, au lieu d’être précis sur ce que vous voulez, vous demandez l’une des deux choses suivantes, puis déterminez laquelle de ces deux choses en cherchant un DOCTYPE ailleurs dans le code (et en essayant ensuite de comprendre si DOCTYPE vous donnera des normes). ou des bizarreries en fonction de son contenu - une autre tâche parfois déroutante). Plutôt que de faire cela, je pense qu'il est beaucoup plus logique de spécifier directement ce que vous voulez, plutôt que de donner une réponse qui est en soi une question. Si vous voulez les normes IE7, utilisez IE = 7 plutôt que IE = EmulateIE7. (Notez que cela ne signifie pas que vous ne devriez pas utiliser un DOCTYPE - vous devriez le faire.)

19
stefan.s

Essayez cette métabalise:

<meta http-equiv="X-UA-Compatible" content="IE=8" />

Cela devrait obliger IE8 à afficher le mode standard IE8 même si l'option "Afficher les sites intranet en mode de compatibilité" est cochée [pour l'intranet ou pour tous les sites Web]. Je l'ai essayée moi-même sur IE 8.0.6.

9
Ala' Alnajjar

Notre administrateur système a résolu ce problème en décochant globalement la case correspondant à notre organisation. Les utilisateurs n'avaient même pas besoin de se déconnecter.

enter image description here

7
James Lawruk

J'ai trouvé une solution de travail qui permet de remplacer la vue de compatibilité Intranet cochée. Ajoutez simplement dans l’événement OnInit de votre page cette ligne (pas besoin de méta ou web.config customHeader):

Response.AddHeader("X-UA-Compatible", "IE=EmulateIE8");
4
Cyrille Perrot

J'ai pu outrepasser le mode de compatibilité en spécifiant la balise méta comme THE FIRST TAG dans la section de tête, pas seulement la première balise méta, mais aussi et uniquement comme TRY FIRST TAG .

Merci à @ stefan.s de m'avoir mis dans cette excellente réponse. Avant de lire que j'avais:

CECI DID NE FONCTIONNE PAS

<head> 
<link rel="stylesheet" type="text/css" href="/qmuat/plugins/editors/jckeditor/typography/typography.php"/>
<meta http-equiv="x-ua-compatible" content="IE=9" >

déplacé l'étiquette de lien sur le chemin et cela a fonctionné

cela fonctionne:

<head><meta http-equiv="x-ua-compatible" content="IE=9" >

Ainsi, un client IE8 configuré pour utiliser la compatibilité rend la page en mode standard IE8 - le contenu = 'IE = 9' signifie que vous utilisez le plus haut standard disponible, y compris IE9.

3
PeteS_UK

Essayez de mettre ce qui suit dans l'en-tête:

<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">

Courtesy Boilerplate HTML5 de Paul Irish (mais cela fonctionne aussi en XHTML Transitional).

3
Gabe

Ce n'est pas vraiment une solution mais, je pense que c'est la meilleure. Sur nos sites intranet, nous disons aux gens que cela n’est accessible que par Firefox, nous n’aimons pas beaucoup les IE utilisateurs d’ici. Vérifiez l'agent utilisateur côté serveur ou côté client et refusez-leur l'accès depuis IE. Et je suis un programmeur .NET.

2
Caimen

J'avais eu du mal à résoudre ce problème et je voulais aider à fournir une solution et un aperçu uniques.

Certains frameworks basés sur AJAX vont injecter des javascripts et des feuilles de style au début du <head>, ce qui semble empêcher le bon fonctionnement de la solution de balises méta bien établie. Dans ce cas, j'ai constaté que l'injection directe dans l'en-tête de réponse HTTP, tout comme la réponse d'Andras Csehi, résoudrait le problème.

Pour ceux d'entre nous qui utilisent Java Servlets, un bon moyen de résoudre ce problème consiste à utiliser un ServletFilter.

public class EmulateFilter implements Filter {

@Override
public void destroy() {
}

@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
        FilterChain arg2) throws IOException, ServletException {
    HttpServletResponse response = ((HttpServletResponse)arg1);
    response.addHeader("X-UA-Compatible", "IE=8");
    arg2.doFilter(arg0, arg1);
}

@Override
public void init(FilterConfig arg0) throws ServletException {
}

}
1
maple_shaft

Nous pouvons résoudre ce problème dans l’environnement Spring-Apache-Tomcat en ajoutant une seule ligne à la méthode RequestInterceptor -

//before the actual handler will be executed
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)
throws Exception {

// Some logic

// below statement ensures IE trusts the page formatting and will render it acc. to IE 8 standard.
response.addHeader("X-UA-Compatible", "IE=8"); 

return true;
}

Référence de - Comment créer un filtre et modifier l'en-tête de la réponse Il explique comment résoudre ce problème via un RequestInterceptor (Spring).

1
JackSparrow

Pour tous ceux qui liront ceci qui cherchent à le désactiver via GPO pour tous les utilisateurs, voici le paramètre:

Configuration de l'ordinateur/Modèles d'administration/Composants Windows/Internet Explorer/Affichage de la compatibilité/Activer le mode standard d'Internet Explorer pour l'intranet local

bien que l'édition de web.config l'a corrigé pour moi.

0
Schrodo_Baggins

Cette question est une copie de Forcer le mode de navigation "Internet Explorer 8" dans un intranet .

Les réponses indiquent qu'il n'est pas possible de désactiver la vue de compatibilité (côté serveur) - https://stackoverflow.com/a/4130343/24267 . Cela semble certainement être le cas, car aucune des suggestions que j'ai essayées n'a fonctionné. Dans IE8, le "Mode navigateur" est configuré sur la vue Compatibilité d'Internet Explorer 8, quel que soit le type d'en-tête compatible X-UA que vous envoyez.

J'ai eu à faire quelques manipulations spéciales pour IE7 et le mode de compatibilité, ce qui a amené le navigateur à utiliser IE8, mais signaler que c'était IE7, a cassé mon code. Voici comment j'ai corrigé mon code (je suis conscient que c'est un piratage horrible et je devrais tester des fonctionnalités et non des versions de navigateur):

 isIE8 = navigator.appVersion.indexOf ("MSIE")! = -1 && parseFloat (navigator.appVersion.split ("MSIE") [1]) == 8; 
 if (! isIE8 && navigator.appVersion.indexOf ("MSIE")! = -1 && parseFloat (navigator.appVersion.split ("MSIE") [1]) == 7 && navigator.appVersion.indexOf ("Trident")! = - 1) {
 // Menteur, IE8 est en mode de compatibilité. 
 IsIE8 = true; 
} 
0
mhenry1384

Ajoutez ceci dans la balise de tête de vos pages (en ciblant la version IE que vous voulez):

<meta http-equiv="X-UA-Compatible" content="IE=8" />  

Notez que cela ne changera PAS le fait que le navigateur dit en mode de compatibilité (appelé le mode du navigateur), mais la page rendra en mode standard IE8. Si son rendu ne rend toujours pas ce que vous souhaitez, c'est probablement parce que vous avez du javascript qui vérifie par erreur le I.E. version. Voir l'article de blog suivant pour déterminer la propriété à partir de laquelle vous devez utiliser une clé , même si vous définissez la balise meta X-UA-Compatible, la chaîne de l'agent d'utilisateur dis toujours MSIE 7.0 .

Dans mon cas, pour le correctif, je devais ajouter une vérification du mode de compatibilité IE7. Je l'ai fait en utilisant un simple code javascript:

                //IE8 and later will have the Word 'trident' in its user agent string.
                if (navigator.userAgent.indexOf("Trident")>-1) { //do something }
0
n00b

Les commentaires de Stefan S sur le mode document par rapport au mode navigateur étaient très pertinents pour mon problème.

J'ai les métadonnées X-UA-Content dans la page, mais je testais la version du navigateur côté client via navigator.appVersion. Ce test ne reflète pas les métadonnées car il donne le mode navigateur et non le mode document.

La réponse pour moi était de tester le document.documentMode quelque chose comme:

function IsIE(n)
{
    if (navigator.appVersion.indexOf("MSIE ") == -1) return false;
    var sDocMode = document.documentMode;
    return (isFinite(sDocMode) && sDocMode==n);
}

Maintenant, ma balise meta X-UA-Content est reflétée dans le test de mon navigateur.

Pourquoi est-ce que je fais une chose aussi mal vue que de tester le navigateur? La vitesse. Divers de mes compléments jQuery, tels que tablesorter, sont trop lents sur IE6/7 et je veux les désactiver. Je ne suis pas sûr que tester les fonctionnalités du navigateur puisse m'aider à résoudre ce problème autrement.

0
Herc

Si vous souhaitez que votre site Web force le IE 8 mode standard, utilisez cette métabalise avec un DOCTYPE valide:

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />

Notez la valeur "EmulateIE8" plutôt que le "IE8" ordinaire.

Selon IE devs, cela devrait: "Afficher les DOCTYPE de Standards en mode Normes IE8; Afficher les DOCTYPE de Quirks en mode Quirks. Utilisez cette balise pour remplacer la vue de compatibilité sur les ordinateurs clients et forcer les Standards aux Normes IE8."

plus d'informations sur ce IE blog: http://blogs.msdn.com/b/ie/archive/2008/08/27/introducing-compatibility-view.aspx

0
ashtonium

Avait le même problème. Cela a fonctionné en utilisant

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9" />
0
Sandro