Як примусово вимкнути режим сумісності IE з боку сервера?


84

У контрольованому доменом середовищі я виявляю, що режим сумісності запускається на певних клієнтах (winXP / Win7, IE8 / IE9), навіть коли ми надаємо теги X-UA, визначення! DOCTYPE та відповідь "IE = Edge" заголовки. Для цих клієнтів встановлено прапорець "відображати сайти інтрамережі у поданні сумісності". Що саме я намагаюся перевизначити.

Далі подана документація, яку я використовував, щоб спробувати зрозуміти, як IE вирішує насправді активувати режим сумісності.

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

Власники сайтів завжди контролюють їх вміст. Власники веб-сайтів можуть використовувати тег, сумісний з X-UA, щоб абсолютно чітко заявити про те, як вони хочуть відображати їхній сайт, і зіставити сторінки режиму стандартів із стандартами IE7. Використання тегу X-UA-Compatible замінює подання сумісності на клієнті.

Google за "Визначення сумісності документів" , на жаль, механізм спаму не дозволяє мені розміщувати більше 2 URL-адрес.

Це ASP .NETвеб-програма, яка містить наступні визначення на головній сторінці:

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

і web.config

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

Я використовував Fiddler, щоб перевірити, чи справді правильно вставлений заголовок.

Я розумію, що за допомогою цих налаштувань я мав би змогу замінити налаштування браузера "Показувати сайти інтрамережі в режимі сумісності". Але залежно від клієнта я виявив, що деякі з них все одно запускатимуть режим сумісності. Це також здається на рівні машини, а не налаштування групи політик, оскільки я отримую різні результати, навіть коли я використовую з однаковим набором облікових даних для різних клієнтів.

Вимкнення прапорця Параметри перегляду сумісності робить трюк. Але фактична мета полягає в тому, щоб переконатися, що програма відображається точно так само, незалежно від налаштувань клієнта.

Будь-які думки і те, чого я міг би пропустити? Чи можливо взагалі змусити IE завжди відображати сторінки, не запускаючи режим Compat?

завдяки мільйонів,

Жауме

PS: сайт наразі розробляється і, звичайно, не входить до списку сумісності Microsoft, але я також перевірив про всяк випадок.

Google за "Розуміння списку перегляду сумісності" , на жаль, механізм спаму не дозволяє мені розміщувати більше 2 URL-адрес.

Відповіді:


45

Я виявив проблеми з двома поширеними способами:

  1. Виконання цього за допомогою спеціальних заголовків ( <customHeaders>) у web.config дозволяє різним розгортанням одного і того ж додатка мати цей набір по-різному. Я бачу в цьому ще одну річ, яка може піти не так, тому я думаю, що краще, якщо програма вказує це в коді. Крім того, IIS6 цього не підтримує .

  2. Включення <meta>тегу HTML на головну сторінку веб-форм або сторінку макета MVC здається кращим, ніж вище. Однак, якщо деякі сторінки не успадковуються від них, тоді тег потрібно продублювати, тому існує потенційна проблема ремонтопридатності та надійності.

  3. Зменшити мережевий трафік можна, лише надіславши X-UA-Compatibleзаголовок клієнтам Internet Explorer.

Добре структуровані програми

Якщо ваша програма структурована таким чином, що всі сторінки в кінцевому підсумку успадковуються з однієї кореневої сторінки, додайте <meta>тег, як показано в інших відповідях .

Застарілі програми

В іншому випадку, я вважаю, що найкращий спосіб зробити це - автоматично додати заголовок HTTP до всіх відповідей HTML. Один із способів зробити це за допомогою 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 повинен використовувати найновіший механізм візуалізації (а не режим сумісності) для візуалізації сторінки.

Здається, модулі HTTP часто реєструються у файлі web.config, але це повертає нас до першої проблеми. Однак ви можете програмно зареєструвати їх у Global.asax так:

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

Зверніть увагу, що важливо, щоб модуль був, staticа не екземпляром, Initщоб на додаток було лише один екземпляр. Звичайно, у реальному додатку цим, мабуть, повинен керувати контейнер IoC.

Переваги

  • Подолає проблеми, окреслені на початку цієї відповіді.

Недоліки

  • Адміністратори веб-сайтів не мають контролю над значенням заголовка. Це може бути проблемою, якщо виходить нова версія Internet Explorer і негативно впливає на візуалізацію веб-сайту. Однак це можна подолати, якщо модуль прочитає значення заголовка з конфігураційного файлу програми, замість використання жорстко закодованого значення.
  • Для роботи з ASP.NET MVC може знадобитися модифікація.
  • Це не працює для статичних HTML-сторінок.
  • PreSendRequestHeadersПодія в наведеному вище коді , здається, не вогонь в IIS6. Я ще не з’ясував, як усунути цю помилку.

2
Можливо, знадобилося більше року, щоб з’явилася ваша відповідь, і фактична програма, над якою я працював, тепер застаріла. Тим не менше, це, безумовно, найбільш ретельна і добре досліджена відповідь, на яку я міг сподіватися. Хороші речі приходять до тих, хто чекає :) дякую Сем
JSancho

1
"Це має гарантувати, що сторінка відображається відповідно до інших браузерів і відповідає стандартам." Вибачте, але це, мабуть, не мій досвід. Зараз я працюю із звітом SSRS, який робить все неправильно в IE10, просто чудово в Chrome і майже чудово в режимі сумісності IE10.
BobRodes

@BobRodes, я думаю, що я це писав, оскільки пізніші версії IE мають бути більш сумісними зі стандартами, але я насправді не говорив з досвіду, тому хороша думка! Я щойно оновив відповідь, щоб видалити цю претензію.
Сем

Microsoft використовує поняття "охоплювати, розширювати, гасити" у відносинах із конкурентами. По-перше, прийміть будь-який стандарт. Потім "вдосконалюємо" стандарт із запатентованими функціями та функціями. Потім тихо відмовтеся від підтримки стандарту в майбутніх версіях. На щастя, у них проблеми з IE. :)
BobRodes

Це спрацювало для мене, і я спробував кілька різних рішень, включаючи мета-тег і намагаючись використовувати css-хаки для обліку ділянок сайту, які не відображалися неправильно, тобто.
user609926

39

Змінення мого заголовка на таке вирішує проблему:

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

Мені також потрібно було додати заголовок клієнта у файл web.config, щоб він працював на сервері Windows 2008
Catch22,

17

Оновлення: Додаткова корисна інформація Що робить <meta http-equiv = "X-UA-Compatible" content = "IE = edge">?

Можливо, ця URL-адреса може вам допомогти: Активація режимів браузера за допомогою Doctype

Редагувати: сьогодні ми змогли замінити подання сумісності з: <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />


@Balanivash Це було насправді гарне читання, дякую за посилання. Стаття змушує мене думати, що "Режим сумісності" ввімкнено, оскільки сайт знаходиться в зоні інтрамережі. Однак це відбувається не послідовно, наприклад: - win7, IE8, на клієнті -> режим повних стандартів - win7, IE8, на іншому полі з однаковими даними -> режим compat Щоб бути в безпеці I ' я також запускаю нові сеанси браузера та скидаю панель інструментів розробника IE до значень за замовчуванням у кожному тесті.
JSancho

Можливо, ви можете спробувати це: <meta http-equiv="X-UA-Compatible" content="IE=8" />
Ендрю

1
Також: Якщо ви хочете, щоб веб-програма повідомила IE8 вам справді довіряти, вам потрібно надіслати X-UA-Compatible як заголовок HTTP із веб-сервера замість метатегу: social.msdn.microsoft.com/Forums/en- США / iewebdevelopment / thread /…
Ендрю

2
Власне сьогодні ми змогли замінити подання сумісності з:<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />
Ендрю

2
Дякуємо за оновлення Вашої відповіді. Я думаю, було б краще, якщо б вашу відповідь вказали, IE=Edgeоскільки питання стосується вимкнення режиму сумісності.
Сем

0

Для розробників Node / Express ви можете використовувати проміжне програмне забезпечення та встановити це через сервер.

app.use(function(req, res, next) {
  res.setHeader('X-UA-Compatible', 'IE=edge');
  next();
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.