Comment désactiver le Mode de compatibilité de IE du côté du serveur?

dans un environnement contrôlé par domaine, je constate que le mode de compatibilité est déclenché sur certains clients (winXP/Win7, IE8/IE9) même lorsque nous fournissons une étiquette X-UA, a !Définition de DOCTYPE et en-têtes de réponse "IE=Edge". Ces clients ont coché la case" Afficher les sites intranet en vue compatibilité". Ce qui est précisément ce que j'essaie de remplacer.

ce qui suit est la documentation que j'ai utilisée pour essayer de comprendre comment IE décide déclencher le mode de compatibilité.

http://msdn.microsoft.com/en-us/library/ff406036%28v=VS.85%29.aspx

http://blogs.msdn.com/b/ie/archive/2009/02/16/just-the-facts-recap-of-compatibility-view.aspx

les propriétaires du Site sont toujours en contrôle de leur contenu. les propriétaires du Site peuvent choisir d'utiliser le X-UA-Compatible tag pour être absolument déclarative sur la façon dont ils aimeraient leur site à afficher et de définir des Normes de pages en mode IE7 Normes. L'utilisation de l'étiquette Compatible X-UA l'emporte sur la vue de compatibilité du client.

Google pour " définir la compatibilité du Document " , malheureusement le moteur de SPAM ne me laisse pas poster plus de 2 urls.

il s'agit d'une application web ASP .NET et comprend définitions suivantes sur la page principale:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<head>
   <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
</head>

et web.config

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

J'ai utilisé Fiddler pour vérifier que l'entête est bien injecté correctement.

ma compréhension est qu'avec ces paramètres, je devrais être en mesure de surpasser le réglage du navigateur" affichage des sites intranet en vue compatibilité". Mais en fonction du client, j'ai trouvé que certains d'entre eux vont encore déclencher le mode compatibilité. Il semble également pour être au niveau de la machine plutôt un réglage de groupe de politique, puisque j'obtiens des résultats différents même si j'utilise avec le même ensemble de justificatifs d'identité sur des clients différents.

désactiver la case à cocher des paramètres de compatibilité fait l'affaire. Mais le véritable but est de s'assurer que l'application est rendue exactement de la même façon, indépendamment des paramètres du client.

des idées et ce que je pourrais manquer? Est-il possible de forcer, c'est à dire toujours rendre les pages sans déclencher le mode Compat?

merci un million,

Jaume

PS: le site est actuellement en développement et n'est bien sûr pas dans la liste de compatibilité de Microsoft, mais j'ai également vérifié juste au cas où.

Google pour " Understanding the Compatibility View List " , malheureusement le moteur de SPAM ne me permet pas de poster plus de 2 urls.

81
demandé sur naXa 2011-07-01 14:30:45

4 réponses

j'ai trouvé des problèmes avec les deux façons courantes de faire ceci:

  1. de le Faire avec des en-têtes personnalisés ( <customHeaders> ) dans le web.config permet à différents déploiements de la même application d'avoir cet ensemble différemment. Je vois cela comme une autre chose qui peut mal tourner, donc je pense que c'est mieux si l'application spécifie ceci en code. De plus, IIS6 ne supporte pas ce .

  2. incluant une balise HTML <meta> dans une page D'accueil des formulaires Web ou une page de mise en page MVC semble mieux que ce qui précède. Cependant, si certaines pages n'héritent pas de celles-ci, alors l'étiquette doit être dupliquée, donc il y a un problème potentiel de maintenabilité et de fiabilité.

  3. le trafic réseau pourrait être réduit uniquement en envoyant l'en-tête X-UA-Compatible aux clients Internet Explorer.

Applications Bien Structurées

si votre application est structurée d'une manière qui fait que toutes les pages héritent ultimement d'une seule page racine, incluez la balise <meta> comme indiqué dans les autres réponses .

L'Héritage Des Applications

sinon, Je pense que la meilleure façon de le faire est d'ajouter automatiquement L'en-tête HTTP à toutes les réponses HTML. une façon de le faire est utilisant un IHttpModule :

public class IeCompatibilityModeDisabler : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.PreSendRequestHeaders += (sender, e) => DisableCompatibilityModeIfApplicable();
    }

    private void DisableCompatibilityModeIfApplicable()
    {
        if (IsIe && IsPage)
            DisableCompatibilityMode();
    }

    private void DisableCompatibilityMode()
    {
        var response = Context.Response;
        response.AddHeader("X-UA-Compatible", "IE=edge");
    }

    private bool IsIe { get { return Context.Request.Browser.IsBrowser("IE"); } }

    private bool IsPage { get { return Context.Handler is Page; } }

    private HttpContext Context { get { return HttpContext.Current; } }

    public void Dispose() { }
}

IE=edge indique QU'IE devrait utiliser son dernier moteur de rendu (plutôt que le mode de compatibilité) pour rendre la page.

il semble que les modules HTTP soient souvent enregistrés sur le web.fichier de configuration, mais cela nous ramène au premier problème. Cependant, vous pouvez les enregistrer programmatiquement dans Global.asax comme ceci:

public class Global : HttpApplication
{
    private static IeCompatibilityModeDisabler module;

    void Application_Start(object sender, EventArgs e)
    {
        module = new IeCompatibilityModeDisabler();
    }

    public override void Init()
    {
        base.Init();
        module.Init(this);
    }
}

notez qu'il il est important que le module soit static et non instancié dans Init de sorte qu'il n'y ait qu'une seule instance par application. Bien sûr, dans une application réelle, un conteneur CIO devrait probablement gérer cela.

avantages

  • surmonte les problèmes décrits au début de cette réponse.

désavantages

  • les administrateurs de site Web n'ont pas contrôle sur la valeur d'en-tête. Cela pourrait être un problème si une nouvelle version D'Internet Explorer sort et affecte négativement le rendu du site web. Toutefois, il serait possible de remédier à cette situation en demandant au module de lire la valeur d'en-tête du fichier de configuration de l'application au lieu d'utiliser une valeur codée sur papier.
  • cela peut nécessiter des modifications pour travailler avec ASP.NET MVC.
  • cela ne fonctionne pas pour les pages statiques HTML.
  • le PreSendRequestHeaders événement dans le code ci-dessus ne semble pas fonctionner dans IIS6. Je n'ai pas trouvé comment résoudre ce bug encore.
43
répondu Sam 2017-05-23 11:54:36

Modifier mon en-tête pour résoudre le problème suivant:

<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
38
répondu Gideon 2012-04-04 13:19:58

mise à Jour: les informations les Plus utiles Ce n' ?

peut-être que cette url peut vous aider: mode D'activation du navigateur avec Doctype

Edit: Aujourd'hui nous avons été en mesure de modifier la vue de compatibilité avec: <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />

16
répondu Andrew Flierman 2017-05-23 12:26:00

pour les développeurs Node/Express, vous pouvez utiliser middleware et le configurer via le serveur.

app.use(function(req, res, next) {
  res.setHeader('X-UA-Compatible', 'IE=edge');
  next();
});
0
répondu mbokil 2017-06-10 09:46:49