webentwicklung-frage-antwort-db.com.de

Wie kann man den Kompatibilitätsmodus des IE zwangsweise von der Serverseite aus setzen?

In einer domänengesteuerten Umgebung stelle ich fest, dass der Kompatibilitätsmodus auf bestimmten Clients (winXP/Win7, IE8/IE9) ausgelöst wird, auch wenn wir X-UA-Tags, eine! DOCTYPE-Definition und die Antwort "IE = Edge" bereitstellen Überschriften Für diese Clients ist das Kontrollkästchen "Intranetsites in Kompatibilitätsansicht anzeigen" aktiviert. Genau das versuche ich zu überschreiben.

Das Folgende ist die Dokumentation, die ich verwendet habe, um zu verstehen, wie IE entscheidet, den Kompatibilitätsmodus auszulösen.

http://msdn.Microsoft.com/de-de/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

Websitebesitzer haben immer die Kontrolle über ihren Inhalt. Websitebesitzer können das X-UA-Compatible-Tag verwenden, um absolut deklarativ zu sein, wie ihre Website angezeigt werden soll, und die Standards-Modus-Seiten den IE7-Standards zuzuordnen. Die Verwendung des X-UA-kompatiblen Tags überschreibt die Kompatibilitätsansicht auf dem Client.

Google für "Definieren der Dokumentenkompatibilität", leider lässt mich die SPAM-Engine nicht mehr als 2 URLs posten.

Dies ist eine ASP .NET-Web-App, die auf der Masterseite die folgenden Definitionen enthält:

<!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>

und web.config

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

Ich habe Fiddler verwendet, um zu überprüfen, ob der Header tatsächlich korrekt eingespritzt wird.

Ich verstehe, dass ich mit diesen Einstellungen die Browsereinstellung "Intranetsites in Kompatibilitätsansicht anzeigen" überschreiben kann. Abhängig vom Client habe ich jedoch festgestellt, dass einige von ihnen immer noch den Kompatibilitätsmodus auslösen .. Es scheint auch auf der Maschinenebene eher eine Richtliniengruppeneinstellung zu sein, da ich selbst dann unterschiedliche Ergebnisse erhalte, wenn ich mit dem gleichen Client arbeite Satz von Anmeldeinformationen für verschiedene Kunden.

Das Deaktivieren des Kontrollkästchens Einstellungen für die Kompatibilitätsansicht bewirkt den Trick. Der eigentliche Zweck besteht jedoch darin, sicherzustellen, dass die App unabhängig von den Client-Einstellungen auf dieselbe Weise gerendert wird.

Irgendwelche Gedanken und was könnte ich möglicherweise vermissen? Ist es überhaupt möglich, IE zu zwingen, die Seiten immer zu rendern, ohne den Compat-Modus auszulösen? 

tausend Dank,

Jaume

PS: Die Site befindet sich derzeit in der Entwicklung und steht natürlich nicht in der Kompatibilitätsliste von Microsoft, aber ich habe sie auch überprüft.

Google für "Verständnis der Kompatibilitätsansicht", leider lässt mich die SPAM-Engine nicht mehr als 2 URLs posten.

83
JSancho

Ich habe Probleme mit den beiden gängigen Methoden gefunden:

  1. Wenn Sie dies mit benutzerdefinierten Headern (<customHeaders>) in web.config tun, kann dies für unterschiedliche Implementierungen derselben Anwendung anders festgelegt werden. Ich sehe dies als eine weitere Sache, die schief gehen kann. Ich denke, es ist besser, wenn die Anwendung dies im Code angibt. IIS6 unterstützt dies nicht .

  2. Das Einfügen eines HTML-Tags <meta> in eine Web Forms-Masterseite oder eine MVC-Layoutseite scheint besser zu sein als oben. Wenn jedoch einige Seiten nicht von diesen erben, muss das Tag dupliziert werden, sodass ein potenzielles Wartungs- und Zuverlässigkeitsproblem auftreten kann.

  3. Der Netzwerkverkehr könnte reduziert werden, indem nur der X-UA-Compatible-Header an Internet Explorer-Clients gesendet wird.

Gut strukturierte Anwendungen

Wenn Ihre Anwendung so strukturiert ist, dass alle Seiten letztendlich von einer einzigen Stammseite erben, fügen Sie das <meta>-Tag wie in die anderen Antworten ein.

Legacy-Anwendungen

Ansonsten Ich denke, der beste Weg, dies zu tun, besteht darin, den HTTP-Header automatisch allen HTML-Antworten hinzuzufügen. Eine Möglichkeit, dies zu tun verwendet eine 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 gibt an, dass IE zum Rendern der Seite die neueste Rendering-Engine (anstelle des Kompatibilitätsmodus) verwenden soll.

Es scheint, dass HTTP-Module häufig in der Datei web.config registriert werden. Dies bringt uns jedoch zum ersten Problem zurück. Sie können sie jedoch programmgesteuert in Global.asax registrieren wie folgt:

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);
    }
}

Beachten Sie, dass es wichtig ist, dass das Modul static ist und nicht in Init instanziiert ist, so dass pro Anwendung nur eine Instanz vorhanden ist. In einer realen Anwendung sollte dies wahrscheinlich von einem IoC-Container verwaltet werden.

Vorteile

  • Überwindet die Probleme, die zu Beginn dieser Antwort beschrieben wurden.

Nachteile

  • Website-Admins haben keinen Einfluss auf den Header-Wert. Dies kann ein Problem sein, wenn eine neue Version von Internet Explorer herauskommt, die die Wiedergabe der Website beeinträchtigt. Dies könnte jedoch dadurch überwunden werden, dass das Modul den Headerwert aus der Konfigurationsdatei der Anwendung liest, anstatt einen fest codierten Wert zu verwenden.
  • Dies erfordert möglicherweise Änderungen, um mit ASP.NET MVC zu arbeiten.
  • Dies funktioniert nicht für statische HTML-Seiten.
  • Das PreSendRequestHeaders-Ereignis im obigen Code scheint in IIS6 nicht ausgelöst zu werden. Ich habe noch nicht herausgefunden, wie ich diesen Fehler beheben kann.
44
Sam

Wenn Sie meinen Header folgendermaßen ändern, lösen Sie das Problem:

<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
39
Gideon

Update: Weitere nützliche Informationen Was macht <meta http-equiv = "X-UA-kompatibel" content = "IE = Edge">?

Vielleicht kann Ihnen diese URL helfen: Browser-Modi mit Doctype aktivieren

Edit: Heute konnten wir die Kompatibilitätsansicht mit: <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" /> überschreiben.

17
Andrew

Für Node/Express-Entwickler können Sie Middleware verwenden und diese über den Server einstellen.

app.use(function(req, res, next) {
  res.setHeader('X-UA-Compatible', 'IE=Edge');
  next();
});
0
mbokil