Переопределить режим совместимости интрасети IE8

По умолчанию IE8 заставляет сайты интрасети внедряться в режим совместимости. Я попытался изменить мета-заголовок на IE8, но он не признает мета-заголовок и просто использует настройку браузера. Кто-нибудь знает, как отключить это?

Ответ 1

Можно переопределить режим совместимости в интрасети.

Для IIS просто добавьте приведенный ниже код в файл web.config. Работал для меня с IE9.

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

Эквивалент для Apache:

Header set X-UA-Compatible: IE=Edge

И для nginx:

add_header "X-UA-Compatible" "IE=Edge";

И для express.js:

res.set('X-UA-Compatible', 'IE=Edge')

Ответ 2

Майкл Иригойен прав, но это немного сложнее...

если вы используете замечательный шаблон Paul Irish, тогда у вас будет что-то вроде следующего: -

<!doctype html>
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
<!--[if IE 7]>    <html class="no-js ie7 oldie" lang="en"> <![endif]-->
<!--[if IE 8]>    <html class="no-js ie8 oldie" lang="en"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

Это будет работать не так, как ожидалось, и заставить IE работать в режиме совместимости в среде Интранет, если у вас установлен флажок "Показывать сайты интрасети в режиме совместимости". Вам необходимо удалить условные комментарии IE, чтобы предотвратить режим совместимости с Интрасети.

Итак, следующий код будет работать:

<!doctype html>
<html class="no-js" lang="en">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

В принципе, если вы вызываете условные комментарии IE перед оператором <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">, тогда вы будете принудительно переведены в режим совместимости в среде Интранет, если вы используете IE9 с настройками по умолчанию.

ОБНОВЛЕНИЕ - ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:. Но обратите внимание, что есть трюк, который заставит работу с килем HTML5:

Добавьте условный комментарий перед, содержащий DOCTYPE. Обратите также внимание на то, что при этом вы также можете добавлять условные комментарии вокруг директивы X-UA-Compatible, что делает страницу HTML5 действительной. Так, например:

<!--[if HTML5]><![endif]-->
<!doctype html>
<!--[if the boilerplate conditionals goes here<![endif]-->
<head>
<!--[if !HTML5]>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<![endif]-->

A запись в блоге, которая была вдохновлена ​​первой частью этого ответа, имеет более подробную информацию. И, кстати: Как упоминалось в этом сообщении в блоге, можно также заменить условный комментарий перед DOCTYPE полусингулярным комментарием с no condition: <!--[]-->. Таким образом, так:

<!--[]-->
<!doctype html>
<!--[if the boilerplate conditionals goes here<![endif]-->
<head>
<!--[if !HTML5]>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<![endif]-->

Но обратите внимание, что последний вариант (<--[]--><!DOCTYPE html>) будет, как объясняется, например, этим ответом на другой вопрос, активировать хорошо известную проблему, что он - для наследия Версии IE без поддержки X-UA-Compatioble (чтение: для IE7 и IE6) - привести браузер в режим quirks.

Ответ 3

Если вы вытащите меню "Инструменты" и выберите "Параметры просмотра совместимости". В этом диалоговом окне внизу находится параметр "Отображать сайты интрасети в режиме совместимости". Если вы снимите этот флажок, чтобы решить проблему, и IE будет использовать режим, основанный на DOCTYPE.

Ответ 4

В ответах на этот вопрос возникает определенное недоумение.

В настоящее время лучшим ответом является серверное решение, которое устанавливает флаг в заголовке http, а некоторые комментарии указывают, что решение, использующее метатег, просто не работает.

Я думаю, что эта запись в блоге дает хороший обзор того, как использовать мета-информацию совместимости, и по моему опыту работает, как описано: http://blogs.msdn.com/b/cjacks/archive/2012/02/29/using-x-ua-compatible-to-create-durable-enterprise-web-applications.aspx

Основные моменты:

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

Один важный момент (и я думаю, что много путаницы исходит из этого момента) заключается в том, что IE имеет два "класса" режимов:

  • Режим документа
  • Режим браузера

Режим документа определяет механизм рендеринга (как отображается веб-страница).

Режим браузера определяет, какая строка IE User-Agent (UA) отправляется на серверы, по умолчанию для IE режима документа и как IE оценивает условные комментарии.

Подробную информацию о режиме документа и браузерах можно найти в этой статье: http://blogs.msdn.com/b/ie/archive/2010/06/16/ie-s-compatibility-features-for-site-developers.aspx?Redirected=true

По моему опыту, метаданные совместимости будут влиять только на режим документа. Поэтому, если вы полагаетесь на обнаружение браузера, это не поможет вам. Но если вы используете обнаружение функции, это должен быть путь.

Поэтому я бы рекомендовал использовать метатег (на странице html) с помощью этого синтаксиса:

<meta http-equiv="X-UA-Compatible" content="IE=9,10" ></meta>

Примечание: укажите список режимов браузера, на которые вы протестировали.

В блоге также сообщается об использовании EmulateIEX. Здесь цитата:

Это, как говорится, одна вещь, которую я нахожу странной, - это когда приложение запросы EmulateIE7 или EmulateIE8. Эти эмулирующие режимы сами по себе решения. Таким образом, вместо того, чтобы быть конкретным о том, что вы хотите, youre прося одну из двух вещей, а затем определить, какая из этих двух вещи, посмотрев в другом месте кода для DOCTYPE (а затем пытаясь понять, даст ли этот DOCTYPE вам стандарты или quirks в зависимости от его содержимого - другое иногда запутывающее задача). Вместо этого я думаю, что это имеет гораздо больший смысл чтобы прямо указать, что вы хотите, вместо того, чтобы дать ответ, который сам по себе вопрос. Если вы хотите стандарты IE7, то используйте IE = 7, скорее чем IE = EmulateIE7. (Обратите внимание, что это не означает, что вы не должны использовать DOCTYPE - вы должны.)

Ответ 5

Попробуйте этот метатег:

<meta http-equiv="X-UA-Compatible" content="IE=8" />

Он должен заставить IE8 отображать в качестве стандартного режима IE8, даже если "показать сайты интрасети в режиме совместимости" отмечен [для интрасети или всех веб-сайтов], я попробовал это самостоятельно в IE 8.0.6

Ответ 6

Наш системный администратор разрешил эту проблему, сняв флажок в глобальном масштабе для нашей организации. Пользователям даже не нужно было выходить из системы.

enter image description here

Ответ 7

Я нашел рабочий ответ, который позволяет переопределить проверенный вид совместимости интрасети. Просто добавьте в событие OnInit вашей страницы эту строку (нет необходимости в мета или config.config):

Response.AddHeader("X-UA-Compatible", "IE=EmulateIE8");

Ответ 8

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

<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

Courtesy Paul Irish HTML5 Boilerplate (но он также работает в XHTML Transitional).

Ответ 9

Мне удалось переопределить режим совместимости, указав метатег как ПЕРВЫЙ ТАГ в разделе главы, а не только первый метатег, но как и только как ОЧЕНЬ ПЕРВАЯ ТЕГА.

Благодаря @stefan.s за то, что он подвел меня к вашему отличному ответу. До того, как я прочитал:

ЭТО НЕ РАБОТАЕТ

<head> 
<link rel="stylesheet" type="text/css" href="/qmuat/plugins/editors/jckeditor/typography/typography.php"/>
<meta http-equiv="x-ua-compatible" content="IE=9" >

переместил тег ссылки в сторону и работал

ЭТО РАБОТЫ:

<head><meta http-equiv="x-ua-compatible" content="IE=9" >

Таким образом, клиент IE8, установленный для использования совместимости, отображает страницу как стандартный режим IE8 - контент = 'IE = 9' означает использование самого высокого стандарта, доступного до IE9 включая IE9.

Ответ 10

Это не совсем решение, но я считаю, что это лучший. На наших сайтах интрасети мы говорим людям, что к ним может быть доступен только Firefox, мы не обращаем внимание на пользователей IE здесь. Проверьте агент пользователя на стороне сервера или клиента и запретите им доступ из IE. И я программист .NET.

Ответ 11

Я боролся с этой проблемой и хотел помочь предоставить уникальное решение и понимание.

Определенные фреймворки на основе AJAX будут вставлять javascripts и таблицы стилей в начале <head>, и, похоже, это предотвращает правильную работу хорошо зарекомендовавшего себя метатега. В этом случае я обнаружил, что прямое вложение в заголовок ответа HTTP, как и ответ Андраса Цейхи, решает проблему.

Для тех из нас, кто использует Java Servlets, хороший способ решить это - использовать ServletFilter.

public class EmulateFilter implements Filter {

@Override
public void destroy() {
}

@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
        FilterChain arg2) throws IOException, ServletException {
    HttpServletResponse response = ((HttpServletResponse)arg1);
    response.addHeader("X-UA-Compatible", "IE=8");
    arg2.doFilter(arg0, arg1);
}

@Override
public void init(FilterConfig arg0) throws ServletException {
}

}

Ответ 12

Мы можем решить эту проблему в среде Spring -Apache-tomcat, добавив одну строку в метод RequestInterceptor -

//before the actual handler will be executed
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)
throws Exception {

// Some logic

// below statement ensures IE trusts the page formatting and will render it acc. to IE 8 standard.
response.addHeader("X-UA-Compatible", "IE=8"); 

return true;
}

Справка из - Как создать фильтр и изменить заголовок ответа Он охватывает, как мы можем решить эту проблему с помощью RequestInterceptor (Spring).

Ответ 13

Если вы хотите, чтобы ваш веб-сайт использовал режим стандартов IE 8, используйте этот метатег вместе с действующим DOCTYPE:

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />

Обратите внимание на значение "EmulateIE8", а не на "IE8".

В соответствии с IE-разработчиками, это должно "Отображать стандарты DOCTYPE в стандарте IE8, отображать Quirks DOCTYPE в режиме Quirks. Используйте этот тег, чтобы переопределить вид совместимости на клиентских машинах и принудительно использовать стандарты для стандартов IE8".

больше информации об этом сообщении в блоге IE: http://blogs.msdn.com/b/ie/archive/2008/08/27/introducing-compatibility-view.aspx

Ответ 14

Была та же проблема. Он работал с помощью

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9" />

Ответ 15

Этот вопрос является дубликатом Force "Internet Explorer 8" браузера в интранете.

В ответах там указано, что невозможно отключить представление совместимости (на стороне сервера) - fooobar.com/questions/10791/.... Конечно, это так, потому что ни одно из предложений, которые я пробовал, не сработало. В IE8 "Режим браузера" устанавливается в представление совместимости Internet Explorer 8 независимо от того, какой вы отправляете заголовок X-UA.

Мне пришлось сделать некоторую специальную обработку для IE7 и режим совместимости, что заставило браузер визуализировать с помощью IE8, но сообщило, что это IE7, сломал мой код. Вот как я исправил свой код (я знаю, что это ужасный хак, и я должен тестировать функции, а не версии браузера):

isIE8 = navigator.appVersion.indexOf("MSIE") != -1 && parseFloat(navigator.appVersion.split("MSIE")[1]) == 8;
if (!isIE8 && navigator.appVersion.indexOf("MSIE") != -1 && parseFloat(navigator.appVersion.split("MSIE")[1]) == 7 && navigator.appVersion.indexOf("Trident") != -1) {
    // Liar, this is IE8 in compatibility mode.
    isIE8 = true;
}

Ответ 16

Добавьте это в свой тег заголовка страниц (с таргетингом на нужную версию IE):

<meta http-equiv="X-UA-Compatible" content="IE=8" />  

Примечание. это НЕ изменит тот факт, что браузер говорит о своем режиме совместимости (называемом браузером), но страница будет отображаться в режиме стандартов IE8. Если его STILL не предоставляет то, как вы хотите, возможно, потому, что у вас есть javascript, который ошибочно проверяет I.E. версия. См. следующее сообщение в блоге, чтобы определить, какое свойство вы должны использовать, потому что , даже если вы установите тег meta X-UA-Compatible, строка пользовательского агента все равно скажет MSIE 7.0.

В моем случае для исправления мне пришлось добавить проверку режима совместимости с IE7. Я сделал это, используя простой код javascript:

                //IE8 and later will have the word 'trident' in its user agent string.
                if (navigator.userAgent.indexOf("Trident")>-1) { //do something }

Ответ 17

Комментарий Stefan S о режиме документа в режиме браузера был очень уместным для моей проблемы.

У меня есть метаданные X-UA-Content на странице, но я тестировал версию браузера на стороне клиента через navigator.appVersion. Этот тест не отражает метаданные, поскольку он предоставляет режим браузера не в режиме документа.

Ответ для меня состоял в том, чтобы проверить document.documentMode что-то вроде:

function IsIE(n)
{
    if (navigator.appVersion.indexOf("MSIE ") == -1) return false;
    var sDocMode = document.documentMode;
    return (isFinite(sDocMode) && sDocMode==n);
}

Теперь мой тег meta X-UA-Content отражен в моем тесте браузера.

Почему я делаю такую ​​нахмуренную вещь, как проверку браузера? Скорость. Различные мои надстройки jQuery, такие как tablesorter, слишком медленны на IE6/7, и я хочу отключить их. Я не уверен, что тестирование функций браузера может помочь мне решить это в противном случае.

Ответ 18

Для всех, кто читает это, чтобы отключить это с помощью объекта групповой политики для всех пользователей, это параметр:

Конфигурация компьютера/Административные шаблоны/Компоненты Windows/Просмотр Internet Explorer/Совместимость/Включение режима стандартов Internet Explorer для локальной интрасети

хотя редактирование web.config исправило это для меня.