Anular el modo de compatibilidad intranet IE8


200

Por defecto, IE8 fuerza a los sitios web de intranet a modo de compatibilidad. Intenté cambiar el meta encabezado a IE8, pero no reconoce el meta encabezado y solo usa la configuración del navegador. ¿Alguien sabe cómo deshabilitar esto?


1
Prueba stackoverflow.com/questions/2742853/… , que funcionó para mí.
David Kolar

2
Agregue esto dentro de la etiqueta de encabezado de su página: <meta http-equiv = "X-UA-Compatible" content = "IE = 8" /> (dirigido a la versión de IE que desee). Tenga en cuenta que esto NO cambiará el hecho de que el navegador dice que está en modo de compatibilidad (llamado modo de navegador), pero la página se mostrará en modo estándar IE8. Luego deberá modificar javascript para verificar si hay "tridente" si está buscando IE8 o posterior. Ver: blogs.msdn.com/b/mikeormond/archive/2008/09/25/…
n00b

@ n00b: esto no tiene ningún efecto en mi sitio.
Pete

Entiendo que la metaetiqueta debe ser inmediatamente después de la etiqueta de la cabeza. Noté que algunos scripts se insertarán en la cabeza en el índice 0; por lo tanto, la metaetiqueta ya no estará después de la cabeza.
Amissico

Respuestas:


224

Es posible anular el modo de compatibilidad en la intranet.

Para IIS, simplemente agregue el siguiente código a web.config. Trabajó para mí con IE9.

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

Equivalente para Apache:

Header set X-UA-Compatible: IE=Edge

Y para nginx:

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

Y para express.js:

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

20
Esta es la respuesta correcta. La metaetiqueta no hace nada, pero agregar el encabezado de respuesta funciona. Más información aquí: social.msdn.microsoft.com/Forums/is/iewebdevelopment/thread/…
russau

3
De acuerdo. Esta debería ser la respuesta correcta, ya que anula correctamente la configuración de la intranet solo para este sitio web.
enriquein

9
(para aclarar: Funciona para el modo de documento, pero no el modo de navegador)
codeulike

21
Esta no es la respuesta correcta. esta respuesta cambia el modo de documento NO cambia el importante "modo de navegador". Todavía estoy buscando una solución a ese problema.
DeveloperChris

44
Esta no es la respuesta correcta, ya que es específica de .net (sin siquiera reconocer el hecho).
Daddy32

84

Michael Irigoyen tiene razón, PERO es un poco más complicado ...

Si está utilizando el maravilloso repetitivo de Paul Irish, tendrá algo como lo siguiente:

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

Esto NO funcionará como se esperaba y forzará en IE a entrar en modo de compatibilidad en un entorno de Intranet si tiene marcada la opción "Mostrar sitios de intranet en vista de compatibilidad". Debe eliminar los comentarios condicionales de IE para evitar el modo de compatibilidad de Intranet.

Entonces el siguiente código funcionará:

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

Básicamente, si desencadena comentarios condicionales de IE antes de <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> declaración, se le obligará a pasar al modo de compatibilidad en un entorno de Intranet si está ejecutando IE9 con la configuración predeterminada.

ACTUALIZACIÓN - INFORMACIÓN ADICIONAL: Pero tenga en cuenta que hay un truco que hará que la plataforma HTML5 funcione:

Agregue un comentario condicional y vacío antes del DOCTYPE. Y tenga en cuenta también que cuando hace eso , también puede agregar comentarios condicionales alrededor delX-UA-Compatible Directiva, por lo que la página HTML 5-válida también. Entonces, por ejemplo:

<!--[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]-->

Una publicación de blog inspirada en la primera parte de esta respuesta tiene más detalles. Y por cierto: Como se mencionó en esa entrada del blog, también se puede reemplazar el comentario condicional antes del DOCTYPE con un condicional semi comentario con ninguna condición : <!--[]-->. Así, así:

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

Pero tenga en cuenta que la última variante ( <--[]--><!DOCTYPE html>), como se explica, por ejemplo, en esta respuesta a otra pregunta , activará el conocido problema de que, para versiones de IE heredadas sin soporte para X-UA-Compatioble(lea: para IE7 e IE6), incorporará el navegador a en modo capricho.


Esto no resolvió el problema para mí. Sin embargo, para su información, al agregar el "Compatible con X-UA" como encabezado, se solucionó el problema.
Scott Rippey

34

Si despliega el menú "Herramientas" y selecciona "Configuración de Vista de compatibilidad" En ese cuadro de diálogo en la parte inferior hay una configuración "Mostrar sitios de intranet en modo de compatibilidad". Si desmarca esto, esto debería resolver el problema e IE usará el modo basado en el DOCTYPE.


19
No voté en contra, pero supongo que es porque respondiste desde la perspectiva del usuario (lo que un usuario debería hacer). Esta pregunta es de un desarrollador web y pregunta cómo solucionar el problema sin requerir que el usuario haga nada en particular.
Roy Tinker

1
Además, esto no permite mantener la compatibilidad con aplicaciones antiguas. Si desmarca esa configuración, sus aplicaciones antiguas pueden romperse sin forma de actualizarlas. Creo que el autor de la pregunta busca una forma de forzar el modo estándar cuando todas las demás aplicaciones en su intranet requieren que la casilla de verificación esté marcada para el modo de compatibilidad.
Andrew Lewis

2
Creo que lo respondió desde la perspectiva del programador. "... IE usará el modo base en el DOCTYPE". Consulte: msdn.microsoft.com/en-us/library/ms535242%28VS.85%29.aspx Si la empresa ejecuta Active Directory, el administrador puede propagar los cambios en la configuración del navegador. ¡No puedes hacer eso con FireFox!
Nate Zaugg

@ AndrewLewis tal vez. Pero, hay un botón de modo de compatibilidad en la barra de URL que configurará el navegador para usar el modo de compatibilidad para ese sitio específico. O puede agregarlos manualmente en el cuadro de diálogo. Una vez más, esto se puede hacer globalmente por TI.
PilotBob

2
@PilotBob si tiene más de 120.000 usuarios y cientos (si no miles) de sitios de intranet que admitir, esta no es una solución viable.
yorch

19

Hay una cierta confusión en las respuestas a esta pregunta.

La respuesta principal es actualmente una solución del lado del servidor que establece un indicador en el encabezado http y algunos comentarios indican que una solución que usa una metaetiqueta simplemente no funciona.

Creo que esta entrada del blog ofrece una buena descripción de cómo usar la metainformación de compatibilidad y, en mi experiencia, funciona como se describe: http://blogs.msdn.com/b/cjacks/archive/2012/02/29/using-x- ua-compatible-para-crear-aplicaciones-web-empresariales-duraderas.aspx

Los puntos principales:

  • configurar la información usando una metaetiqueta y en el encabezado ambos funcionan
  • La metaetiqueta tiene prioridad sobre el encabezado
  • La metaetiqueta tiene que ser la primera etiqueta, para asegurarse de que el navegador no determine antes el motor de renderizado en función de la heurística.

Un punto importante (y creo que mucha confusión viene de este punto) es que IE tiene dos "clases" de modos:

  1. El modo de documento
  2. El modo de navegador

El modo de documento determina el motor de representación (cómo se representa la página web).

El modo de navegador determina qué cadena de User-Agent (UA) envía IE a los servidores, qué valor predeterminado tiene el modo de documento y cómo evalúa los comentarios condicionales.

Puede encontrar más información sobre el modo de documento frente al modo de navegador en este artículo: http://blogs.msdn.com/b/ie/archive/2010/06/16/ie-s-compatibility-features-for- site-developers.aspx? Redirected = true

En mi experiencia, los metadatos de compatibilidad solo influirán en el modo de documento . Entonces, si confía en la detección del navegador, esto no lo ayudará. Pero si está utilizando la detección de funciones, este debería ser el camino a seguir.

Por lo tanto, recomendaría usar la metaetiqueta (en la página html) usando esta sintaxis:

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

Aviso: proporcione una lista de los modos de navegador que ha probado.

La publicación del blog también desaconseja el uso de EmulateIEX. Aquí una cita:

Dicho esto, una cosa que encuentro extraña es cuando una aplicación solicita EmulateIE7 o EmulateIE8. Estos modos de emulación son ellos mismos decisiones. Entonces, en lugar de ser específico sobre lo que quiere, está pidiendo una de dos cosas y luego determina cuál de esas dos cosas al buscar un DOCTYPE en otro lugar (y luego intenta comprender si ese DOCTYPE le dará estándares o caprichos dependiendo de su contenido, otra tarea a veces confusa). En lugar de hacer eso, creo que tiene mucho más sentido especificar directamente lo que desea, en lugar de dar una respuesta que en sí misma es una pregunta. Si desea los estándares IE7, utilice IE = 7, en lugar de IE = EmulateIE7. (Tenga en cuenta que esto no significa que no deba usar un DOCTYPE, debería hacerlo).


¿Cómo cambiar el modo de navegador?
Vishnudev K

la frase del modo navegador es confusa
Justice Fist

@JusticeFist Sí, tienes razón, gracias. Traté de mejorarlo.
stefan.s

1
@VishnudevK La única forma en que lo sé es usando las herramientas de desarrollador. Pero probablemente quieras una solución programática.
stefan.s

9

Prueba esta metaetiqueta:

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

Debería forzar a IE8 a renderizarse como modo estándar de IE8 incluso si se marca "Mostrar sitios de intranet en vista de compatibilidad" [ya sea para intranet o para todos los sitios web], lo probé yo mismo en IE 8.0.6


15
No, no lo hace.
Dennis C

11
Esto es realmente correcto, pero DEBE aparecer antes que todas las etiquetas META en la página o no funcionará.
Michael Irigoyen

2
Esto no funciona para mi. Por lo que yo puedo decir IE8s "Display sitios de intranet en el modo de compatibilidad" es un-overrideable
codeulike

66
(para aclarar: funciona para el modo de documento, pero no para el modo de navegador. Por lo tanto, el procesamiento es fijo, pero el navegador todavía pretende ser IE7)
codeulike

7

Nuestro administrador del sistema resolvió este problema desmarcando la casilla globalmente para nuestra organización. Los usuarios ni siquiera necesitaban cerrar sesión.

ingrese la descripción de la imagen aquí


1
Esta solución funciona perfectamente si todos los sitios en la intranet pueden usar los últimos estándares web. Sin embargo, si algunos no pueden, este método los romperá inadvertidamente ... Me acercaría con precaución.
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

4

Encontré una respuesta que permite anular la Vista de compatibilidad de Intranet marcada. Solo agregue en el evento OnInit de su página esta línea (no necesita meta o web.config customHeader):

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

1
Respuesta específica de la plataforma de desarrollo ... sin siquiera especificar la plataforma. ¿Supongo que estás hablando de Visual Studio .NET? Por lo que puedo decir, el evento 'OnInit' no existe (en Javascript, Java, PHP, ...)
Stijn de Witt


3

Pude anular el modo de compatibilidad especificando la metaetiqueta como LA PRIMERA ETIQUETA en la sección de encabezado, no solo la primera metaetiqueta, sino como la PRIMERA ETIQUETA .

Gracias a @ stefan.s por ponerme en ello en su excelente respuesta. Antes de leer que tenía:

ESTO NO FUNCIONÓ

<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" >

movió la etiqueta de enlace fuera del camino y funcionó

Esto funciona :

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

Por lo tanto, un cliente IE8 configurado para usar compatibilidad representa la página como modo estándar IE8: el contenido = 'IE = 9' significa usar el estándar más alto disponible hasta IE9 inclusive.


2

Esto no es exactamente una solución, pero creo que es la mejor. En nuestros sitios de intranet, le decimos a la gente que solo Firefox puede acceder a ella, no amamos a los usuarios de IE por aquí. Verifique el agente de usuario en el lado del servidor o del cliente y niegue el acceso desde IE. Y soy un programador .NET.


1
Me gusta tu idea. pero no tenemos firefox aquí.
Dennis C

22
Peor. Sugerencia. Nunca. Eso es tan malo como todos los sitios de intranet que son solo de IE. Intenta hacer un poco de trabajo extra y haz que tus cosas funcionen en todos los navegadores comunes. No es tan dificil.
mhenry1384

2
@ mhenry1384 ¿Le gustaría explicar por qué es una sugerencia terrible tener un sistema de intranet bloqueado? No tiene que admitir quarks para navegadores antiguos. Sabes que tus usuarios obtendrán la experiencia deseada. No es un sistema público, a quién le importa, ¿sigues siendo compatible con IE 5.5? Les digo a mis usuarios públicos que actualicen. De todos modos, no debería perder mi tiempo en sistemas de back-end, es el público el que me necesita. No es que lo bloquee a IE 6 y requiera ActiveX como algunos. Por ejemplo, mi sistema permite Firefox 6 y superior. Entonces, si sale Firefox 27, aún funciona. O me denigran o hacen una discusión real.
Caimen

2
Todos los sitios de intranet que utilicé que estaban bloqueados en un navegador específico están bloqueados en IE. Esto me vuelve loco, ya que odio a IE tanto como el próximo chico. Obligar a sus usuarios a usar el navegador de su elección (no el de ellos), incluso si es algo PERO IE, parece contrario a la web, incluso a la intranet web. Por lo general, no es tan difícil hacer que un sitio web funcione en IE7 / 8/9, especialmente si usa bibliotecas como jQuery. Deje que los usuarios usen lo que quieran.
mhenry1384

2
Un sitio escrito para Firefox 10, por ejemplo, en mi experiencia casi siempre funcionará perfectamente bien en IE9 sin modificaciones. Por lo tanto, restringir a los usuarios el uso de IE9 significa que está sucediendo algo más. Indica que estás en una misión ideal, no alguien que intenta escribir un buen software web. Si solo se trata de no tener tiempo para probar otros navegadores que no sean Firefox, ¿también restringe a las personas el uso de Opera? [Perdón por ser tan prolijo. Debería volver a solucionar este maldito problema de IE8 que tengo ... :-)]
mhenry1384

1

Había luchado con este problema y quería ayudar a proporcionar una solución y una visión únicas.

Ciertos marcos basados ​​en AJAX inyectarán javascripts y hojas de estilo al comienzo del <head> y hacer esto parece evitar que la solución de metaetiquetas bien establecida funcione correctamente. En este caso, descubrí que inyectar directamente en el encabezado de respuesta HTTP, al igual que la respuesta de Andras Csehi, resolverá el problema.

Sin embargo, para aquellos de nosotros que usamos Java Servlets, una buena manera de resolver esto es usar un 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

Podemos resolver este problema en el entorno Spring-Apache-tomcat agregando una sola línea en el método 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;
}

Referencia de - Cómo crear un filtro y modificar el encabezado de respuesta Cubre cómo podemos resolver este problema a través de un RequestInterceptor (Spring).


0

Si desea que su sitio web fuerce el modo estándar IE 8, use esta metaetiqueta junto con un DOCTYPE válido:

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

Tenga en cuenta el valor "EmulateIE8" en lugar del simple "IE8".

De acuerdo con los desarrolladores de IE, esto debería ser: "Mostrar los DOCTYPE de estándares en el modo de estándares IE8; Mostrar los DOCTYPE de Quirks en modo de Quirks. Use esta etiqueta para anular la vista de compatibilidad en las máquinas cliente y forzar los estándares a los estándares IE8".

Más información sobre esta publicación del blog de IE: http://blogs.msdn.com/b/ie/archive/2008/08/27/introducing-compatibility-view.aspx


0

Esta pregunta es un duplicado del modo de navegador Force "Internet Explorer 8" en la intranet .

Las respuestas allí indican que no es posible deshabilitar la vista de compatibilidad (en el lado del servidor): https://stackoverflow.com/a/4130343/24267 . Ese ciertamente parece ser el caso, ya que ninguna de las sugerencias que he probado ha funcionado. En IE8, el "Modo de navegador" se configura en la vista de compatibilidad de Internet Explorer 8 sin importar qué tipo de encabezado compatible con X-UA envíe.

Tuve que hacer un manejo especial para IE7 y el modo de compatibilidad, lo que provocó que el navegador se procesara con IE8 pero informara que era IE7, rompió mi código. Así es como arreglé mi código (soy consciente de que este es un truco horrible y debería probar las características, no las versiones del navegador):

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) {
    // Mentiroso, esto es IE8 en modo de compatibilidad.
    isIE8 = verdadero;
}

0

Tuve el mismo problema Funcionó usando

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

0

Agregue esto dentro de la etiqueta principal de sus páginas (orientada a la versión de IE que desee):

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

Tenga en cuenta que esto NO cambiará el hecho de que el navegador dice que está en modo de compatibilidad (llamado modo de navegador), pero la página se mostrará en modo estándar IE8. Si TODAVÍA no se muestra como lo desea, probablemente sea porque tiene JavaScript que está verificando erróneamente la versión de IE. Consulte la siguiente publicación de blog para determinar de qué propiedad debería estar quitando porque incluso si configura la etiqueta compatible con meta X-UA, la cadena del agente de usuario seguirá diciendo MSIE 7.0 .

En mi caso, para la solución tuve que agregar una verificación para el modo de compatibilidad de IE7. Lo hice usando un código javascript simple:

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

0

Para cualquier otra persona que lea esto y busque deshabilitar esto a través de GPO para todos los usuarios, esta es la configuración:

Configuración del equipo / Plantillas administrativas / Componentes de Windows / Internet Explorer / Vista de compatibilidad / Activar el modo de estándares de Internet Explorer para Intranet local

aunque la edición web.config lo arregló para mí.


Para ir al Editor de directivas de grupo local , puede ejecutar gpedit.msc desde Ejecutar.
RUMANIA_engineer


0

El comentario de Stefan S sobre el modo de documento versus el modo de navegador fue muy pertinente para mi problema.

Tengo los metadatos X-UA-Content en la página, pero estaba probando la versión del navegador del lado del cliente navigator.appVersion . Esta prueba no refleja los metadatos porque le da al modo de navegador no al modo de documento.

La respuesta para mí fue probar document.documentModealgo como:

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

Ahora, mi etiqueta meta X-UA-Content se refleja en la prueba de mi navegador.

¿Por qué hago algo tan mal visto como probar el navegador? Velocidad. Varios de mis complementos de jQuery, como tablesorter, son demasiado lentos en IE6 / 7, y quiero desactivarlos. No estoy seguro de que probar las características del navegador pueda ayudarme a resolver esto de otra manera.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.