Как принудительно отключить режим совместимости 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-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>
Я использовал скрипач, чтобы проверить, что заголовок действительно вводится правильно.
Я понимаю, что с этими настройками я должен иметь возможность переопределить параметр браузера "отображать сайты интрасети в режиме совместимости". Но в зависимости от клиента я обнаружил, что некоторые из них все равно будут запускать режим совместимости. Это также похоже на уровень машины, а не на параметр группы политик, так как я получаю разные результаты, даже когда я использую один и тот же набор учетных данных на разных клиенты.
отключение настройки просмотра совместимости флажок делает трюк. Но фактическая цель состоит в том, чтобы убедиться, что приложение отображается точно так же, независимо от настроек клиента.
любые мысли и то, что я мог бы быть возможно отсутствует? Можно ли вообще заставить IE, чтобы всегда отображать страницы без запуска в режиме совместимости?
огромное спасибо,
Jaume
PS: сайт в настоящее время находится в разработка и, конечно, не в списке совместимости Microsoft, но я также проверил на всякий случай.
Google для "понимание списка просмотра в режиме совместимости", к сожалению, спам-движок не позволяет мне размещать более 2 url-адресов.
4 ответа:
Я нашел проблемы с двумя распространенными способами сделать это:
это делается с помощью пользовательских заголовков (
<customHeaders>
) в интернете.конфигурация позволяет различным развертываниям одного и того же приложения иметь этот набор по-разному. Я вижу это как еще одну вещь, которая может пойти не так, поэтому я думаю, что лучше, если приложение указывает это в коде. Кроме того,IIS6 не поддерживает это.включая HTML
<meta>
тег в Мастере веб-форм Страница или страница макета MVC кажется лучше, чем выше. Однако, если некоторые страницы не наследуются от них, то тег должен быть дублирован, поэтому существует потенциальная проблема ремонтопригодности и надежности.сетевой трафик может быть уменьшен только отправка
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, но это возвращает нас к первой проблеме. Однако,вы можете зарегистрировать их программно в мировой.асакс такой:
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-страниц.
- The
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" />