Перевизначення режиму сумісності внутрішньої мережі IE8


200

За замовчуванням IE8 змушує веб-сайти внутрішньої мережі перейти в режим сумісності. Я спробував змінити мета-заголовок на IE8, але він не підтверджує мета-заголовок і просто використовує налаштування браузера. Хтось знає, як це відключити?


1
Спробуйте stackoverflow.com/questions/2742853/… , який працював для мене.
Девід Колар

2
Додайте всередину заголовка тег до сторінок: <meta http-equiv = "X-UA-Compatible" content = "IE = 8" /> (орієнтований на потрібну версію IE). Зауважте, це НЕ змінить того факту, що браузер говорить про це в режимі сумісності (називається режимом браузера), але сторінка буде відображатися в стандартному режимі IE8. Тоді вам потрібно буде змінити javascript, щоб перевірити "тризуб", якщо ваша перевірка на IE8 чи пізнішу версію. Дивіться: blogs.msdn.com/b/mikeormond/archive/2008/09/25/…
n00b

@ n00b - це не впливає на мій сайт.
Піт

Я розумію, що метатег повинен мені відразу після заголовка. Я помітив, що деякі сценарії вставлятимуть у голову з індексом 0; таким чином, мета-тег більше не буде після голови.
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
Погодьтеся. Це має бути правильною відповіддю, оскільки він правильно переосмислює налаштування інтрамережі лише для цього веб-сайту.
enriquein

9
(для уточнення: працює в режимі документа, але не в режимі браузера)
кодовий

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:

Додайте порожній, умовний коментар перед ДОКТОМ. І зауважте , як добре, що коли ви робите що , то ви можете також додати умовні коментарі навколо 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) - приведе браузер у quirks-режим.


Це не вирішило для мене проблеми. Однак, FYI, додавши "X-UA-сумісний" як DID заголовка, вирішить проблему!
Скотт Ріппей

34

Якщо ви випустите меню "Інструменти" і виберіть "Налаштування перегляду сумісності", у цьому діалоговому вікні внизу встановлено налаштування "Відображення сайтів інтрамережі в режимі сумісності". Якщо ви знімете цей прапорець, це повинно вирішити проблему, і IE використовуватиме режим, заснований на DOCTYPE.


19
Я не став голосом, але я б припустив, що ви відповіли з точки зору користувача (що повинен робити користувач). Це запитання від веб-розробника, і він запитує, як виправити проблему, не вимагаючи від користувача нічого конкретного.
Рой Тінкер

1
Крім того, це не дозволяє підтримувати сумісність зі старими програмами. Якщо ви зніміть цей прапорець, ваші старі програми можуть зламатись, інакше їх не можна оновити Я думаю, що запитувач шукає спосіб примусити стандартний режим, коли всі інші додатки в їхній інтрамережі вимагають перевірити прапорець на сумісність.
Ендрю Льюїс

2
Я вважаю, що він відповів на це з точки зору програміста. "... IE використовуватиме базу режимів ДОКТОМУ". Див.: Msdn.microsoft.com/en-us/library/ms535242%28VS.85%29.aspx Якщо в компанії працює Active Directory, зміни налаштувань браузера можуть бути розповсюджені адміністратором. Ви не можете цього зробити з FireFox!
Нейт Заугг

@AndrewLewis можливо. Але в рядку URL є кнопка режиму сумісності, яка дозволить браузеру використовувати режим компакт-інтерфейсу для конкретного сайту. Або ви можете додати їх вручну в діалоговому вікні. Знову цю інформацію можна зробити глобально за допомогою ІТ.
PilotBob

2
@PilotBob, якщо у вас є 120K + користувачів та сотні (якщо немає тисяч) інтранет-сайтів для підтримки, це не є прийнятним рішенням.
йорч

19

У відповідях на це запитання існує певна сум'яття.

Верхня відповідь на даний момент - це серверне рішення, яке встановлює прапор у заголовку http, а деякі коментарі свідчать про те, що рішення з використанням метатега просто не працює.

Я думаю, що цей запис у блозі дає хороший огляд використання мета-інформації про сумісність, і, на моєму досвіді, працює так, як описано: http://blogs.msdn.com/b/cjacks/archive/2012/02/29/using-x- ua-сумісний для створення-довговічний-підприємство-web-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- site-developers.aspx? Перенаправлено = вірно

На мій досвід, метадані сумісності впливатимуть лише на режим документа . Тож якщо ви покладаєтесь на виявлення браузера, це вам не допоможе. Але якщо ви використовуєте функцію виявлення функцій, це повинен бути шлях.

Тому я рекомендую використовувати метатег (на сторінці html), використовуючи цей синтаксис:

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

Примітка. Наведіть список режимів браузера, на які ви протестовані.

Повідомлення в блозі також надає рекомендації щодо використання EmulateIEX. Ось цитата:

Зважаючи на це, одне, що мені здається дивним, - це коли програма запитує EmulateIE7 або EmulateIE8. Ці режими емуляції самі є рішеннями. Отже, замість того, щоб конкретизувати те, що ви хочете, ви запитаєте одну з двох речей, а потім визначаєте, яку з цих двох речей, шукаючи в іншому місці коду для ДОКТИПУ (а потім намагаєтесь зрозуміти, чи дасть вам цей ДОКТИП стандартів або химерність залежно від її змісту - ще одне, часом заплутане завдання). Замість того, щоб зробити це, я думаю, що має сенс значно більше сенсу безпосередньо вказувати, що ви хочете, а не давати відповідь, яка сама по собі є питанням. Якщо ви хочете стандартів IE7, тоді використовуйте IE = 7, а не IE = EmulateIE7. (Зверніть увагу, що це не означає, що ви не повинні використовувати DOCTYPE - слід.)


як змінити режим браузера?
Вишнудев К

Речення в режимі браузера заплутане
Justice Fist

@JusticeFist Так, ви праві, дякую. Я намагався його вдосконалити.
stefan.s

1
@VishnudevK Єдиний спосіб мене знає - це використання інструментів розробника. Але ви, мабуть, хочете програмного рішення.
stefan.s

9

Спробуйте цей метатег:

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

Це повинно змусити IE8 відобразити як стандартний режим IE8, навіть якщо встановлено прапорець "Відображати сайти інтрамережі в режимі сумісності" [або для інтранет, або для всіх веб-сайтів], я спробував це самостійно на IE 8.0.6


15
Ні, це не є.
Dennis C

11
Це насправді правильно, але воно ОБОВ'ЯЗКОВО з'явиться перед будь-якими та всіма тегами META на сторінці, або це не працюватиме.
Майкл Ірігойен

2
Це не працює для мене. Наскільки я можу сказати, IE8s "Відображати сайти інтрамережі в режимі сумісності" не можна перезаписати
codeulike

6
(для уточнення: Він працює в режимі документа, але не в режимі браузера. Отже, візуалізація виправлена, але браузер все ще видає себе за IE7)
codeulike

7

Наш системний адміністратор вирішив цю проблему, знявши прапорець для цієї організації глобально. Користувачам навіть не потрібно було виходити з системи.

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


1
Це рішення чудово працює, якщо всі сайти в інтрамережі можуть використовувати найновіші веб-стандарти. Однак, якщо дехто не зможе, тоді цей спосіб ненавмисно порушить їх ... Я підійшов би з обережністю.
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

4

Я знайшов робочу відповідь, яка дозволяє перекрити перевірений Інтранет Перегляд сумісності. Просто додайте в події OnInit на своїй сторінці цей рядок (не потрібно ні мета, ні 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.
Dennis C

22
Найгірше. Пропозиція. Колись. Це так само погано, як і всі інтранет-сайти, які є лише IE. Спробуйте виконати трохи додаткових робіт, а ваші речі працюватимуть у всіх звичайних браузерах. Це не так складно.
mhenry1384

2
@ mhenry1384 Хочете пояснити, чому це жахлива пропозиція мати заблоковану систему інтрамережі? Не потрібно підтримувати кварки для старих браузерів. Ви знаєте, що ваші користувачі отримають призначений досвід. Це не громадська система, хто дбає, ти все ще підтримуєш IE 5.5? Я кажу своїм публічним користувачам оновити. Я не повинен витрачати свій час на бекенд-системи, мені потрібна громадськість. Це не так, як я зафіксував його до IE 6 і вимагаю ActiveX як деякі. Наприклад, моя система дозволяє Firefox 6 і вище. Тож якщо Firefox 27 вийде, він все одно працює. Або спростуйте мене, або зробіть фактичний аргумент.
Каймен

2
Кожен веб-сайт внутрішньої мережі, який я використовував, був заблокований до певного браузера, заблокований до IE. Це зводить мене з розуму, оскільки я ненавиджу IE так само, як наступний хлопець. Змушувати своїх користувачів використовувати обраний вами браузер (не їхній), навіть якщо це щось НЕ, але здається, що суперечить Інтернету, навіть інтранет. Просто не так складно отримати веб-сайт, що працює в IE7 / 8/9, особливо якщо ви використовуєте бібліотеки типу jQuery. Нехай користувачі використовують те, що хочуть.
mhenry1384

2
Наприклад, сайт, написаний для Firefox 10, з мого досвіду майже завжди буде працювати чудово на IE9 без змін. Тож обмеження користувачів використовувати IE9 означає, що відбувається щось інше. Це вказує, що ви перебуваєте в ідеальній місії, а не хтось намагається написати гарне програмне забезпечення в Інтернеті. Якщо це було лише питання про те, щоб не встигнути тестувати браузери, окрім Firefox, чи забороняєте ви також людей використовувати Opera? [Вибачте за те, що настільки багатослівний. Мені слід повернутися до виправлення цієї проклятої проблеми з IE8, з якою у мене ... :-)]
mhenry1384

1

Я боровся з цим питанням і хотів допомогти забезпечити унікальне рішення та розуміння.

Деякі рамки на базі AJAX вводять javascripts та таблиці стилів на початку <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. Використовуйте цей тег, щоб перекрити подання сумісності на клієнтських машинах та змусити стандарти до стандартів IE8."

Докладніше про це повідомлення в блозі IE: http://blogs.msdn.com/b/ie/archive/2008/08/27/introducing-compatibility-view.aspx


0

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

Відповіді там свідчать, що неможливо відключити представлення сумісності (на стороні сервера) - https://stackoverflow.com/a/4130343/24267 . Це, звичайно, так і є, тому що жодна пропозиція, яку я спробував, не спрацювала. В 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 ("Тризуб") ! = -1) {
    // Брехун, це IE8 в режимі сумісності.
    isIE8 = вірно;
}

0

Була така ж проблема. Це працювало за допомогою

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

0

Додайте це всередині заголовка тегів (орієнтуючись на потрібну версію IE):

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

Зауважте, це НЕ змінить того факту, що браузер говорить про це в режимі сумісності (називається режимом браузера), але сторінка буде відображатися в стандартному режимі IE8. Якщо його НІКОЛИ не відображається, як ви хочете, це, ймовірно, тому, що у вас є JavaScript, який помилково перевіряє версію IE. Перегляньте наступне повідомлення в блозі, щоб визначити, яку властивість слід відключити, оскільки навіть якщо ви встановите мета-X-UA-сумісний тег, рядок агента користувача все одно буде говорити 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

Коментар Стефана 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);
}

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

Чому я роблю таку нахмурену річ, як тестування браузера? Швидкість. Різні мої додатки jQuery, як-от tableorter, надто повільні в IE6 / 7, і я хочу їх вимкнути. Я не впевнений, що тестування функцій браузера може допомогти мені вирішити це інакше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.