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

в контролируемой доменом среде я нахожу, что режим совместимости запускается на определенных клиентах (winXP/Win7, IE8/IE9), даже когда мы предоставляем теги X-UA, a !Определение 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-совместимого тега переопределяет представление совместимости на клиенте.

Google для "Определение Совместимости Документов", к сожалению, спам-движок не позволяет мне размещать более 2 url-адресов.

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

<!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-адресов.

4 ответов


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

  1. делать это с пользовательскими заголовками (<customHeaders>) в интернете.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-модули часто регистрируются в интернете.файл config, но это возвращает нас к первой проблеме. Однако,вы можете зарегистрировать их программно в Global.асакс такой:

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. Я еще не понял, как устранить эту ошибку.

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

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

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

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

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


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

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