IE'nin Uyumluluk Modu sunucu tarafında nasıl kapatılır?


84

Etki alanı kontrollü bir ortamda, X-UA etiketleri, bir! DOCTYPE tanımı ve "IE = Edge" yanıtı sağlasak bile belirli istemcilerde (winXP / Win7, IE8 / IE9) uyumluluk modunun tetiklendiğini görüyorum. başlıklar. Bu istemcilerde "intranet sitelerini uyumluluk görünümünde göster" onay kutusu işaretlenmiştir. Bu tam olarak geçersiz kılmaya çalıştığım şey.

Aşağıda, IE'nin uyumluluk modunu gerçekten tetiklemeye nasıl karar verdiğini anlamaya çalışmak için kullandığım belgeler var.

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

Site sahipleri her zaman içeriklerinin kontrolündedir. Site sahipleri, sitelerinin nasıl görüntülenmesini istedikleri konusunda kesinlikle açıklayıcı olmak ve Standartlar modu sayfalarını IE7 Standartlarına eşlemek için X-UA-Uyumlu etiketi kullanmayı seçebilirler. X-UA-Uyumlu etiketinin kullanılması, istemcide Uyumluluk Görünümü'nü geçersiz kılar.

Google için "Belge Uyumluluğunu Tanımlamak" , ne yazık ki SPAM motoru 2'den fazla url göndermeme izin vermiyor.

Bu bir ASP .NETweb uygulamasıdır ve ana sayfada aşağıdaki tanımları içerir:

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

ve web.config

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

Başlığın gerçekten doğru şekilde enjekte edildiğini kontrol etmek için Fiddler'ı kullandım.

Anladığım kadarıyla, bu ayarlarla "Intranet sitelerini Uyumluluk Görünümünde görüntüle" tarayıcı ayarını geçersiz kılabilmeliyim. Ancak istemciye bağlı olarak, bazılarının hala uyumluluk modunu tetikleyeceğini buldum. Aynı zamanda, farklı istemcilerde aynı kimlik bilgileriyle kullandığım zaman bile farklı sonuçlar elde ettiğim için, bir politika grubu ayarı yerine makine düzeyinde görünüyor.

Uyumluluk Görünümü Ayarları onay kutusunu devre dışı bırakmak hile yapar. Ancak asıl amaç, istemci ayarlarından bağımsız olarak uygulamanın tamamen aynı şekilde oluşturulduğundan emin olmaktır.

Herhangi bir düşünce ve muhtemelen neyi kaçırabilirim? IE'yi sayfaları Uyumluluk modunu tetiklemeden her zaman oluşturmaya zorlamak mümkün müdür?

milyonlarca kez teşekkürler,

Jaume

Not: site şu anda geliştirme aşamasında ve elbette Microsoft'un uyumluluk listesinde değil, ancak tam olarak kontrol ettim.

"Uyumluluk Görünümü Listesini Anlamak" için Google , ne yazık ki SPAM motoru 2'den fazla url göndermeme izin vermiyor.

Yanıtlar:


45

Bunu yapmanın iki yaygın yolu ile ilgili sorunlar buldum:

  1. Bunu <customHeaders>web.config dosyasındaki özel başlıklar ( ) ile yapmak , aynı uygulamanın farklı dağıtımlarının bu kümeye farklı şekilde sahip olmasına izin verir. Bunu yanlış gidebilecek bir şey olarak görüyorum, bu yüzden uygulamanın bunu kodda belirtmesinin daha iyi olacağını düşünüyorum. Ayrıca, IIS6 bunu desteklemez .

  2. <meta>Bir Web Formları Ana Sayfasına veya MVC Yerleşim Sayfasına bir HTML etiketi eklemek yukarıdakinden daha iyi görünüyor. Ancak, bazı sayfalar bunlardan devralmazsa, etiketin kopyalanması gerekir, bu nedenle olası bir sürdürülebilirlik ve güvenilirlik sorunu vardır.

  3. Ağ trafiği, yalnızca X-UA-Compatiblebaşlık Internet Explorer istemcilerine gönderilerek azaltılabilir .

İyi Yapılandırılmış Uygulamalar

Uygulamanız, tüm sayfaların sonuçta tek bir kök sayfadan devralınmasına neden olacak şekilde yapılandırılmışsa, <meta>etiketi diğer yanıtlarda gösterildiği gibi ekleyin .

Miras başvuruları

Aksi takdirde, bunu yapmanın en iyi yolunun, HTTP başlığını tüm HTML yanıtlarına otomatik olarak eklemek olduğunu düşünüyorum. Bunu yapmanın bir yolu şudur 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 IE'nin sayfayı oluşturmak için en son oluşturma motorunu (uyumluluk modu yerine) kullanması gerektiğini belirtir.

Görünüşe göre HTTP modülleri genellikle web.config dosyasına kaydediliyor, ancak bu bizi ilk soruna geri getiriyor. Ancak, bunları Global.asax'a programlı olarak şu şekilde kaydedebilirsiniz :

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

Modülün staticsomutlaştırılmasının ve oluşturulmamasının önemli olduğunu unutmayın .InitUygulama başına yalnızca bir örnek . Tabii ki, gerçek dünya uygulamasında bir IoC konteyneri muhtemelen bunu yönetmelidir.

Avantajlar

  • Bu cevabın başında ana hatları verilen sorunların üstesinden gelir.

Dezavantajları

  • Web sitesi yöneticilerinin başlık değeri üzerinde kontrolü yoktur. Internet Explorer’ın yeni bir sürümü çıktığında ve web sitesinin işlenmesini olumsuz etkilediğinde bu bir sorun olabilir. Bununla birlikte, modülün sabit kodlanmış bir değer kullanmak yerine uygulamanın konfigürasyon dosyasından başlık değerini okumasını sağlayarak bunun üstesinden gelinebilir.
  • Bu, ASP.NET MVC ile çalışmak için değişiklik gerektirebilir.
  • Bu, statik HTML sayfalarında çalışmaz.
  • PreSendRequestHeadersYukarıdaki kodda olay IIS6 yangın görünmüyor. Henüz bu hatayı nasıl çözeceğimi bulamadım.

2
Cevabınızın gelmesi bir yıldan fazla zaman almış olabilir ve üzerinde çalıştığım gerçek uygulama artık kullanımdan kaldırıldı. Yine de, bu kesinlikle umabileceğim en kapsamlı ve en iyi araştırılmış cevaptır.
Bekleyenlere güzel

1
"Bu, sayfanın diğer tarayıcılarla tutarlı ve standartlara uygun bir şekilde oluşturulmasını sağlamalıdır." Üzgünüm, ama bu hiç de benim deneyimim olmadı. Şu anda, IE10'da tamamen yanlış, Chrome'da gayet iyi ve IE10 uyumluluk modunda hemen hemen iyi olan bir SSRS raporu üzerinde çalışıyorum.
BobRodes

@BobRodes, sanırım bunu yazdım çünkü IE'nin sonraki sürümlerinin daha standartlara uygun olması gerekiyordu, ancak gerçekten deneyimden konuşmuyordum, çok iyi nokta! Bu iddiayı kaldırmak için yanıtı güncelledim.
Sam

Microsoft, rakipleriyle ilişkilerinde "kucakla, genişlet, söndür" kavramını kullanmaktadır. İlk olarak, her tür standardı benimseyin. Ardından, tescilli özellikler ve işlevlerle standardı "geliştirin". Ardından, gelecekteki sürümlerde standart için desteği sessizce bırakın. Neyse ki, IE ile bu konuda sorun yaşıyorlar. :)
BobRodes

Bu benim için çalıştı ve meta etiketi dahil olmak üzere birkaç farklı çözümü denedim ve sitenin yanlış şekilde oluşturulmayan alanlarını hesaba katmak için css hack'lerini kullanmaya çalıştım.
user609926

39

Başlığımı aşağıdaki şekilde değiştirmek sorunu çöz:

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

Ayrıca, Windows 2008 sunucusunda çalışmasını sağlamak için müşteri başlığını web.config dosyasına
eklemem gerekiyordu

17

Güncelleme: Daha yararlı bilgiler <meta http-equiv = "X-UA-Compatible" content = "IE = edge"> ne işe yarar ?

Belki bu url size yardımcı olabilir: Doctype ile Tarayıcı Modlarını Etkinleştirme

Düzenleme: Bugün uyumluluk görünümünü şu şekilde geçersiz kılabildik: <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />


@Balanivash Bu gerçekten iyi bir okumaydı, bağlantı için teşekkürler. Makale, site intranet bölgesinde yer aldığı için "Uyumluluk Modu" nun etkinleştirildiğine inanmamı sağlıyor. Ancak, bu tutarlı bir şekilde gerçekleşmez, örneğin: - bir istemcide win7, IE8 -> tam standartlar modu - win7, IE8, aynı kimlik bilgilerine sahip farklı bir kutuda -> uyum modu Güvenli tarafta olmak I ' m ayrıca tarayıcının yeni oturumlarını başlatmak ve IE geliştirici araç çubuğunu her testte varsayılan değerlere sıfırlamak.
JSancho

Belki bunu deneyebilirsiniz: <meta http-equiv="X-UA-Compatible" content="IE=8" />
Andrew

1
Ayrıca: Web uygulamanızın IE8'e gerçekten güvenmesini istemesini istiyorsanız, meta etiket yerine web sunucunuzdan bir HTTP başlığı olarak X-UA-Compatible göndermeniz gerekir: social.msdn.microsoft.com/Forums/en- US / iewebdevelopment / thread /…
Andrew

2
Aslında bugün uyumluluk görünümünü şu şekilde geçersiz <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />
Andrew

2
Cevabınızı güncellediğiniz için teşekkürler. IE=EdgeSoru uyumluluk modunu devre dışı bırakmakla ilgili olduğu için cevabınızı belirtmeniz daha iyi olur diye düşünüyorum .
Sam

0

Node / Express geliştiricileri için ara yazılım kullanabilir ve bunu sunucu aracılığıyla ayarlayabilirsiniz.

app.use(function(req, res, next) {
  res.setHeader('X-UA-Compatible', 'IE=edge');
  next();
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.