Как принудительно установить режим совместимости IE с сервера?

В среде, контролируемой доменом, я обнаружил, что режим совместимости запускается на определенных клиентах (winXP / Win7, IE8 / IE9), даже когда мы предоставляем tags 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-Compatible абсолютно декларативно о том, как они хотели бы, чтобы их сайт отображал и сопоставлял страницы режима стандартов со стандартами IE7. Использование тега X-UA-Compatible отменяет представление совместимости на клиенте.

Google для «Определение совместимости документов» , к сожалению, механизм SPAM не позволяет мне размещать более двух URL-адресов.

Это веб-приложение ASP.NET и включает следующие определения на главной странице:

     

и web.config

         

Я использовал Fiddler для проверки правильности ввода заголовка.

Я понимаю, что с этими настройками я мог бы переопределить настройку браузера «Просмотр интрасети в режиме совместимости». Но в зависимости от клиента я обнаружил, что некоторые из них по-прежнему будут запускать режим совместимости. Похоже, что уровень машинного уровня зависит скорее от уровня групповой политики, так как я получаю разные результаты, даже когда я использую один и тот же набор учетных данных для разных клиентов.

Отключение настройки параметров просмотра совместимости делает трюк. Но фактическая цель – убедиться, что приложение отображается точно так же, независимо от настроек клиента.

Любые мысли и то, что я мог бы, возможно, отсутствовать? Возможно ли вообще заставить IE всегда отображать страницы без запуска режима совместного использования?

бесконечно благодарен,

Жауме

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

Google для «Просмотр списка совместимости» , к сожалению, механизм SPAM не позволяет мне размещать более двух URL-адресов.

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

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

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

    3. Сетевой трафик может быть уменьшен только путем отправки заголовка X-UA-Compatible для клиентов Internet Explorer.

    Хорошо структурированные приложения

    Если ваше приложение структурировано таким образом, что все страницы в конечном итоге наследуются с одной корневой страницы, тег как показано в других ответах .

    Устаревшие приложения

    В противном случае, я думаю, лучший способ сделать это – автоматически добавлять 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. Я еще не понял, как решить эту ошибку.

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

        

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

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

    Изменить: Сегодня мы смогли переопределить представление совместимости с помощью:

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

     app.use(function(req, res, next) { res.setHeader('X-UA-Compatible', 'IE=edge'); next(); }); 
    Давайте будем гением компьютера.