По умолчанию IE8 переводит сайты интрасети в режим совместимости. Я попытался изменить мета-заголовок на IE8, но он не подтверждает мета-заголовок и просто использует настройки браузера. Кто-нибудь знает как это отключить?
По умолчанию IE8 переводит сайты интрасети в режим совместимости. Я попытался изменить мета-заголовок на IE8, но он не подтверждает мета-заголовок и просто использует настройки браузера. Кто-нибудь знает как это отключить?
Ответы:
Можно переопределить режим совместимости в интрасети.
Для 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')
Михаэль Иригойен прав, НО это немного сложнее ...
Если вы используете замечательный шаблон Пола Айриша, у вас будет что-то вроде следующего:
<!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) - приводит браузер в причуд режим.
Если вы откроете меню «Инструменты» и выберете «Параметры просмотра в режиме совместимости», то в этом диалоговом окне внизу появится параметр «Отображать сайты интрасети в режиме совместимости». Если снять этот флажок, это должно решить проблему, и IE будет использовать режим, основанный на DOCTYPE.
В ответах на этот вопрос есть определенная путаница.
Верхний ответ в настоящее время - это решение на стороне сервера, которое устанавливает флаг в заголовке http, и некоторые комментарии указывают, что решение, использующее метатег, просто не работает.
Я думаю, что эта запись в блоге дает хороший обзор того, как использовать метаинформацию о совместимости, и по моему опыту работает так, как описано: http://blogs.msdn.com/b/cjacks/archive/2012/02/29/using-x- UA-Compatible к создавать долговечный-корпоративный веб-applications.aspx
Основные моменты:
Одним из важных моментов (и я думаю, что из-за этого возникает путаница), у IE есть два «класса» режимов:
Режим документа определяет механизм визуализации (как отображается веб-страница).
Режим браузера определяет, какую строку 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 - вы должны.)
Попробуйте этот метатег:
<meta http-equiv="X-UA-Compatible" content="IE=8" />
Это должно заставить IE8 отображаться как стандартный режим IE8, даже если установлен флажок «Отображать сайты интрасети в представлении совместимости» [для интрасети или для всех веб-сайтов], я попробовал сам на IE 8.0.6
Наш системный администратор решил эту проблему, сняв флажок глобально для нашей организации. Пользователям даже не нужно было выходить из системы.
Я нашел рабочий ответ, позволяющий переопределить проверенное представление о совместимости в интрасети. Просто добавьте в событие OnInit вашей страницы эту строку (не нужно ни meta, ни web.config customHeader):
Response.AddHeader("X-UA-Compatible", "IE=EmulateIE8");
Попробуйте добавить в шапку следующее:
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
Предоставлено HTML5 Boilerplate Пола Айриша (но он работает и в XHTML Transitional).
Мне удалось переопределить режим совместимости, указав метатег в качестве ПЕРВОГО тега в разделе заголовка, а не только в первом метатеге, но и в качестве ОЧЕНЬ ПЕРВЫГО тега .
Спасибо @ 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 включительно.
Это не совсем решение, но я считаю, что оно лучшее. На наших сайтах в интрасети мы говорим людям, что к нему может получить доступ только Firefox, мы не очень любезны к пользователям IE здесь. Проверьте пользовательский агент на стороне сервера или клиента и запретите им доступ из IE. И я программист .NET.
Я боролся с этой проблемой и хотел помочь обеспечить уникальное решение и понимание.
Некоторые платформы на основе 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 {
}
}
Мы можем решить эту проблему в среде 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).
Если вы хотите, чтобы ваш веб-сайт включал режим стандартов 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
Этот вопрос является дубликатом режима браузера 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 = правда; }
Добавьте это внутри тега 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 }
Для всех, кто читает это и хочет отключить это через GPO для всех пользователей, это настройка:
Конфигурация компьютера / Административные шаблоны / Компоненты Windows / Internet Explorer / Представление совместимости / Включение стандартного режима Internet Explorer для локальной интрасети
хотя редактирование web.config исправило это для меня.
Измените заголовки в .htaccess
BrowserMatch MSIE ie
Header set X-UA-Compatible "IE=Edge,chrome=1" env=ie
Нашел решение этой проблемы здесь: https://github.com/h5bp/html5-boilerplate/issues/378
Комментарий Стефана С. о режиме документа и режиме браузера был очень уместен для моей проблемы.
У меня есть метаданные 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, и я хочу их отключить. Я не уверен, что тестирование функций браузера поможет мне решить эту проблему иначе.