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

200

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

sanpall
источник
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.

PilotBob
источник
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
источник
как изменить режим браузера?
Вишнудев К.
предложение режима браузера сбивает с толку
кулак правосудия
@ Справедливость Да, вы правы, спасибо. Я пытался улучшить это.
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

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

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

Предоставлено HTML5 Boilerplate Пола Айриша (но он работает и в XHTML Transitional).

Гейб
источник
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 включительно.

PeteS_UK
источник
2

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

Caimen
источник
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 {
}

}
maple_shaft
источник
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

ashtonium
источник
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 = правда;
}
mhenry1384
источник
0

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

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9" />
Sandro
источник
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 }
n00b
источник
0

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

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

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

Schrodo_Baggins
источник
Чтобы перейти в редактор локальной групповой политики , вы можете запустить 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, и я хочу их отключить. Я не уверен, что тестирование функций браузера поможет мне решить эту проблему иначе.

Херц
источник