Как принудительно отключить режим совместимости IE со стороны сервера? - PullRequest
83 голосов
/ 01 июля 2011

В среде, управляемой доменом, я обнаружил, что режим совместимости запускается на определенных клиентах (winXP / Win7, IE8 / IE9), даже когда мы предоставляем теги X-UA, определение! DOCTYPE и "IE =Пограничный»заголовки ответа.На этих клиентах установлен флажок «отображать сайты интрасети в режиме совместимости».Именно это я и пытаюсь переопределить.

Ниже приведена документация, которую я использовал, чтобы попытаться понять, как 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?

спасибо миллион,

Jaume

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

Google для "Понимание списка совместимости" , к сожалению, механизм СПАМа не позволяет мне публиковать более 2 URL.

Ответы [ 4 ]

44 голосов
/ 21 мая 2013

Я обнаружил проблемы с двумя распространенными способами сделать это:

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

  2. Включение тега HTML <meta> в главную страницу веб-форм или страницу макета 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. Я еще не выяснил, как устранить эту ошибку.
39 голосов
/ 04 апреля 2012

Изменение моего заголовка на следующее решает проблему:

<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
17 голосов
/ 01 июля 2011

Обновление: более полезная информация Что делаетdo?

Может быть, этот URL может помочь вам: Активация режимов браузера с помощью Doctype

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

0 голосов
/ 10 июня 2017

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

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