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


200

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


1
Попробуйте stackoverflow.com/questions/2742853/… , который работал для меня.
— Дэвид Колар

2
Добавьте это внутри тега head ваших страниц: <meta http-equ = "X-UA-Compatible" content = "IE = 8" /> (для целевой версии IE). Обратите внимание, это НЕ изменит тот факт, что браузер говорит, что он находится в режиме совместимости (называемом режимом браузера), но страница будет отображаться в режиме стандартов IE8. Затем вам нужно будет изменить javascript, чтобы проверить «трезубец», если вы проверяете IE8 или более позднюю версию. См: blogs.msdn.com/b/mikeormond/archive/2008/09/25/...
— n00b

@ n00b - это никак не влияет на мой сайт.
— Пит

Я понимаю, что метатег должен быть сразу после заголовка. Я заметил, что некоторые скрипты будут вставлены в голову с индексом 0; таким образом, метатег больше не будет после head.
— AMissico

Ответы:


224

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

Для 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')

20
Это правильный ответ. Мета-тег ничего не делает, но добавление заголовка ответа работает. Более подробная информация здесь: social.msdn.microsoft.com/Forums/is/iewebdevelopment/thread/...
— russau

3
Согласен. Это должен быть правильный ответ, поскольку он корректно переопределяет настройки интрасети только для этого веб-сайта.
— Энрикеин

9
(чтобы уточнить: это работает для режима документа, но не для режима браузера)
— codeulike

21
Это не правильный ответ. этот ответ меняет режим документа, он не меняет важный «режим браузера». Я все еще ищу решение этой проблемы.
— DeveloperChris

4
Это не правильный ответ, так как он является конкретным .net (даже не признавая факт).
— Daddy32

84

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

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

<!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:

Добавьте emtpy, условный комментарий перед 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]-->

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

<!--[]-->
<!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) - приводит браузер в причуд режим.


Это не решило проблему для меня. Однако, к вашему сведению, добавление «X-UA-Compatible» в качестве заголовка DID решило проблему!
— Скотт Риппи

34

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


19
Я не понизил голос, но я предполагаю, что это потому, что вы ответили с точки зрения пользователя (что должен делать пользователь). Этот вопрос задан веб-разработчиком и задает вопрос о том, как решить проблему, не требуя от пользователя каких-либо конкретных действий.
— Рой Тинкер

1
Кроме того, это не позволяет поддерживать совместимость со старыми приложениями. Если вы снимите флажок с этого параметра, ваши старые приложения могут выйти из строя без возможности их обновления. Я думаю, что спрашивающий ищет способ форсировать режим стандартов, когда все другие приложения в их интрасети требуют, чтобы флажок был установлен для режима совместимости.
— Эндрю Льюис

2
Я считаю, что он ответил на это с точки зрения программиста. Msgstr "... IE будет использовать базу режима на DOCTYPE". См .: msdn.microsoft.com/en-us/library/ms535242%28VS.85%29.aspx Если в компании работает Active Directory, изменения в настройках браузера могут распространяться администратором. Вы не можете сделать это с FireFox!
— Нейт Заугг

@ AndrewLewis возможно. Но в строке URL есть кнопка режима совместимости, которая настроит браузер на использование режима Compat для этого конкретного сайта. Или вы можете добавить их вручную в диалоговом окне. Еще раз, это может быть сделано глобально ИТ.
— PilotBob

2
@PilotBob, если у вас есть 120K + пользователей и сотни (если не тысячи) сайтов интрасети для поддержки, это не жизнеспособное решение.
— Йорк

19

В ответах на этот вопрос есть определенная путаница.

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

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

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

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

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

  1. Режим документа
  2. Режим браузера

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

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

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

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

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

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

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

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

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


как изменить режим браузера?
— Вишнудев К.

предложение режима браузера сбивает с толку
— кулак правосудия

@ Справедливость Да, вы правы, спасибо. Я пытался улучшить это.
— stefan.s

1
@VishnudevK Единственный способ, которым я знаю, - это использование инструментов разработчика. Но вы, вероятно, хотите программное решение.
— stefan.s

9

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

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

Это должно заставить IE8 отображаться как стандартный режим IE8, даже если установлен флажок «Отображать сайты интрасети в представлении совместимости» [для интрасети или для всех веб-сайтов], я попробовал сам на IE 8.0.6


15
Нет.
— Денис С

11
Это на самом деле правильно, но он ДОЛЖЕН появляться перед любыми мета-тегами на странице, иначе он не будет работать.
— Майкл Иригойен

2
Это не работает для меня. Насколько я могу судить, IE8s «Отображать сайты интрасети в режиме совместимости»
— нельзя

6
(чтобы уточнить: он работает для режима документа, но не для режима браузера. Таким образом, рендеринг исправлен, но браузер по-прежнему претендует на IE7)
— codeulike 20.10.11

7

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

введите описание изображения здесь


1
Это решение отлично работает, если все сайты в интрасети могут использовать новейшие веб-стандарты. Однако, если кто-то не сможет, этот метод непреднамеренно сломает их ... Я бы подошел с осторожностью.
— ʙᴀᴋᴇʀ ʙᴀᴋᴇʀ

4

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

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

1
Ответ для конкретной платформы разработки ... даже без указания платформы. Я предполагаю, что вы говорите о Visual Studio .NET? Насколько я могу судить, событие OnInit не существует (в Javascript, Java, PHP, ....)
— Stijn de Witt


3

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

Спасибо @ stefan.s за то, что вы ответили мне на ваш отличный ответ. До прочтения что у меня было:

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

<head> 
<link rel="stylesheet" type="text/css" href="https://stackoverflow.com/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 - content = 'IE = 9' означает использование самого высокого стандарта, доступного до IE9 включительно.


2

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


1
Мне нравится твоя идея. но у нас нет Firefox здесь.
— Денис С

22
Наихудший. Предложение. Когда-либо. Это так же плохо, как и все сайты интрасети, которые предназначены только для IE. Попробуйте проделать небольшую дополнительную работу и заставить ваши вещи работать во всех распространенных браузерах. Это не так сложно.
— mhenry1384

2
@ mhenry1384 Не могли бы вы объяснить, почему это ужасное предложение иметь заблокированную интранет-систему? Вам не нужно поддерживать кварки для старых браузеров. Вы знаете, что ваши пользователи получат необходимый опыт. Это не публичная система, кого это волнует, вы все еще поддерживаете IE 5.5? Я говорю своим публичным пользователям обновить. В любом случае я не должен тратить свое время на бэкэнд-системы, я нуждаюсь в публике. Это не так, как я закрываю его до IE 6 и требую ActiveX, как некоторые. Например, моя система поддерживает Firefox 6 и выше. Так что, если Firefox 27 выйдет, он все еще работает. Либо опровергни меня, либо приведи реальный аргумент.
— Caimen

2
Каждый сайт интрасети, который я использовал, который был заблокирован для определенного браузера, заблокирован для IE. Это сводит меня с ума, так как я ненавижу IE так же, как и следующий парень. Принуждение ваших пользователей использовать браузер по вашему выбору (не их), даже если это что-то, НО IE, кажется, противоречит сети, даже сети интрасети. Просто не так сложно заставить сайт работать в IE7 / 8/9, особенно если вы используете такие библиотеки, как jQuery. Пусть пользователи используют то, что они хотят.
— mhenry1384

2
Например, сайт, написанный для Firefox 10, почти всегда будет отлично работать на IE9 без изменений. Таким образом, ограничение пользователей использовать IE9 означает, что происходит что-то еще. Это указывает на то, что вы выполняете идеологическую миссию, а не тот, кто пытается написать хорошее веб-программное обеспечение. Если речь шла просто о том, что у вас нет времени на тестирование браузеров, отличных от Firefox, запрещаете ли вы людям использовать Opera? [Извините за то, что так многословно. Я должен вернуться к решению этой чертовой проблемы IE8, которая у меня возникла ... :-)]
— mhenry1384

1

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

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

Однако для тех из нас, кто использует сервлеты Java, хорошим способом решения этой проблемы является использование 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 {
}

}

1

Мы можем решить эту проблему в среде 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).


0

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

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

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

Согласно разработчикам IE, это должно выглядеть так: «Отображать DOCTYPE стандартов в режиме стандартов IE8; отображать DOCTYPE Quirks в режиме Quirks. Используйте этот тег, чтобы переопределить представление совместимости на клиентских компьютерах и привести стандарты в стандарты IE8».

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


0

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

Ответы там показывают, что невозможно отключить представление совместимости (на стороне сервера) - https://stackoverflow.com/a/4130343/24267 . Это, безусловно, имеет место, поскольку ни одно из предложенных мною предложений не сработало. В IE8 «Режим браузера» настраивается на просмотр в режиме совместимости Internet Explorer 8 независимо от того, какой тип заголовка X-UA-Compatible вы отправляете.

Я должен был сделать некоторую специальную обработку для 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) {
    // Лжец, это IE8 в режиме совместимости.
    isIE8 = правда;
}

0

Была такая же проблема. Работало с помощью

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

0

Добавьте это внутри тега head ваших страниц (для целевой версии IE):

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

Обратите внимание, это НЕ изменит тот факт, что браузер говорит, что он находится в режиме совместимости (называемом режимом браузера), но страница будет отображаться в режиме стандартов IE8. Если он по-прежнему не рендерится так, как вы хотите, вероятно, потому что у вас есть javascript, который ошибочно проверяет версию IE. См. Следующий пост в блоге, чтобы определить, какое свойство следует использовать, потому что даже если вы установите метатег 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 }

0

Для всех, кто читает это и хочет отключить это через GPO для всех пользователей, это настройка:

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

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


Чтобы перейти в редактор локальной групповой политики , вы можете запустить gpedit.msc из Run.
— ROMANIA_engineer


0

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

У меня есть метаданные 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);
}

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.