Substituir o modo de compatibilidade da intranet IE8

200

Por padrão, o IE8 força os sites da intranet a entrar no modo de compatibilidade. Tentei alterar o cabeçalho da meta para IE8, mas ele não reconhece o cabeçalho da meta e apenas usa a configuração do navegador. Alguém sabe como desativar isso?

Sanpall
fonte
1
Tente stackoverflow.com/questions/2742853/… , que funcionou para mim.
precisa
2
Adicione isso dentro do cabeçalho da sua página: <meta http-equiv = "Compatível com X-UA" content = "IE = 8" /> (segmentando a versão do IE desejada). Observe que isso NÃO altera o fato de o navegador informar que está no modo de compatibilidade (chamado de modo do navegador), mas a página será renderizada no modo de padrões do IE8. Você precisará alterar o javascript para verificar se há "tridente" se estiver verificando o IE8 ou posterior. Veja: blogs.msdn.com/b/mikeormond/archive/2008/09/25/…
n00b 12/12/12
@ n00b - isso não afeta o meu site.
Pete
Meu entendimento é que a meta tag deve me imediatamente após a tag head. Notei que alguns scripts serão inseridos no cabeçalho no índice 0; assim, a metatag não será mais a cabeça.
AMissico

Respostas:

224

É possível substituir o modo de compatibilidade na intranet.

Para o IIS, basta adicionar o código abaixo ao web.config. Trabalhou para mim com o 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

E para nginx:

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

E para express.js:

res.set('X-UA-Compatible', 'IE=Edge')
Andras Csehi
fonte
20
Essa é a resposta correta. A metatag não faz nada, mas adicionar o cabeçalho de resposta funciona. Mais informações aqui: social.msdn.microsoft.com/Forums/is/iewebdevelopment/thread/…
russau
3
Aceita. Essa deve ser a resposta correta, pois substitui corretamente a configuração da intranet apenas para este site.
enriquein 01/09/11
9
(para esclarecer: Ele trabalha para o modo de documento, mas não modo de navegação)
codeulike
21
Esta não é a resposta correta. Esta resposta altera o modo de documento. NÃO altera o importante "modo de navegador". Ainda estou procurando uma solução para esse problema.
DeveloperChris
4
Esta não é a resposta correta, pois é específica para .net (sem nem mesmo reconhecer o fato).
Daddy32
84

Michael Irigoyen está correto, mas é um pouco mais complicado ...

se você estiver usando o maravilhoso boilerplate de Paul Irish, terá algo como o seguinte: -

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

Isso NÃO funcionará conforme o esperado e forçará o IE a entrar no modo de compatibilidade em um ambiente da Intranet se você tiver marcado "Exibir sites da intranet na exibição de compatibilidade". Você precisa remover os comentários condicionais do IE para impedir o modo de compatibilidade da Intranet.

Portanto, o seguinte código funcionará:

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

Basicamente, se você acionar comentários condicionais do IE antes da <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">instrução, será forçado a entrar no modo de compatibilidade em um ambiente da Intranet , se estiver executando o IE9 com as configurações padrão.

ATUALIZAÇÃO - INFORMAÇÕES ADICIONAIS: Mas observe que há um truque que fará o modelo HTML5 funcionar:

Adicione um comentário vazio e condicional antes do DOCTYPE. E observe também que, ao fazer isso , você também pode adicionar comentários condicionais em torno da X-UA-Compatiblediretiva, tornando a página HTML5 válida também. Então, por exemplo:

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

Uma postagem de blog inspirada na primeira parte desta resposta tem mais detalhes. E a propósito: Como mencionado nesse post, também se pode substituir o comentário condicional antes do DOCTYPE com um condicional semi comentário com nenhuma condição : <!--[]-->. Assim, assim:

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

Mas observe que a última variante ( <--[]--><!DOCTYPE html>), como explicado, por exemplo, por esta resposta a outra pergunta , ativará o problema bem conhecido de que ele - para versões herdadas do IE sem suporte para o X-UA-Compatioble(leia-se: para IE7 e IE6) - coloca o navegador em modo peculiar.

Andrew
fonte
Isso não resolveu o problema para mim. No entanto, para sua informação, adicionar o "X-UA-Compatible" como um cabeçalho corrigiu o problema!
22812 Scott Rippey #
34

Se você abrir o menu "Ferramentas" e escolher "Configurações de exibição de compatibilidade" Na caixa de diálogo na parte inferior, há uma configuração "Exibir sites da intranet no modo de compatibilidade". Se você desmarcar isso, deve resolver o problema e o IE usará o modo com base no DOCTYPE.

PilotBob
fonte
19
Não diminuí o voto, mas acho que é porque você respondeu da perspectiva do usuário (o que um usuário deve fazer). Esta pergunta é de um desenvolvedor da web e está perguntando como corrigir o problema sem exigir que o usuário faça algo em particular.
Roy Tinker
1
Além disso, isso não permite manter a compatibilidade com aplicativos antigos. Se você desmarcar essa configuração, seus aplicativos antigos poderão ser interrompidos sem nenhuma maneira de atualizá-los. Acho que o solicitante está procurando uma maneira de forçar o modo de padrões quando todos os outros aplicativos em sua intranet exigem que a caixa de seleção seja marcada para o modo de compatibilidade.
Andrew Lewis
2
Acredito que ele respondeu da perspectiva do programador. "... O IE usará a base de modo no DOCTYPE". Consulte: msdn.microsoft.com/en-us/library/ms535242%28VS.85%29.aspx Se a empresa estiver executando o Active Directory, as alterações nas configurações do navegador poderão ser propagadas pelo administrador. Você não pode fazer isso com o FireFox!
Nate Zaugg
@AndrewLewis talvez. Porém, existe o botão do modo de compatibilidade na barra de URL que configurará o navegador para usar o modo compatível para esse site específico. Ou você pode adicioná-los manualmente na caixa de diálogo. Mais uma vez, esse material pode ser feito globalmente pela TI.
PilotBob 27/02
2
@PilotBob, se você tiver mais de 120 mil usuários e centenas (se não milhares) de sites de intranet para oferecer suporte, essa não é uma solução viável.
yorch
19

Há uma certa confusão nas respostas a esta pergunta.

A resposta principal é atualmente uma solução do lado do servidor que define um sinalizador no cabeçalho http e alguns comentários indicam que uma solução usando uma metatag simplesmente não funciona.

Acho que esta entrada de blog fornece uma boa visão geral de como usar as meta informações de compatibilidade e, em minha experiência, funciona conforme descrito: http://blogs.msdn.com/b/cjacks/archive/2012/02/29/using-x- ua-compatible-to-create-durable-enterprise-web-applications.aspx

Os pontos principais:

  • definir as informações usando uma metatag e no cabeçalho funciona
  • A metatag tem precedência sobre o cabeçalho
  • A metatag deve ser a primeira, para garantir que o navegador não determine o mecanismo de renderização antes com base nas heurísticas

Um ponto importante (e acho que muita confusão vem desse ponto) é que o IE tem duas "classes" de modos:

  1. O modo de documento
  2. O modo do navegador

O modo de documento determina o mecanismo de renderização (como a página da web é renderizada).

O Modo Navegador determina qual sequência de caracteres do User-Agent (UA) que o IE envia aos servidores, para qual padrão o Document IE e como o IE avalia os Comentários Condicionais.

Mais informações sobre o modo de documento x modo de navegador podem ser encontradas neste artigo: http://blogs.msdn.com/b/ie/archive/2010/06/16/ie-s-compatibility-features-for- site-developers.aspx? Redirecionado = true

Na minha experiência, os metadados de compatibilidade influenciarão apenas o modo de documento . Portanto, se você está confiando na detecção do navegador, isso não ajuda. Mas se você estiver usando a detecção de recursos, esse deve ser o caminho a seguir.

Então, eu recomendaria o uso da metatag (na página html) usando esta sintaxe:

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

Aviso: forneça uma lista dos modos de navegador que você testou.

A postagem do blog também aconselha contra o uso do EmulateIEX. Aqui está uma citação:

Dito isto, uma coisa que acho estranha é quando um aplicativo solicita o EmulateIE7 ou o EmulateIE8. Esses modos de emulação são eles próprios decisões. Portanto, em vez de ser específico sobre o que você deseja, você está pedindo uma de duas coisas e, em seguida, determinando quais dessas duas coisas procurando em outro lugar no código por um DOCTYPE (e depois tentando entender se esse DOCTYPE fornecerá padrões ou peculiaridades, dependendo do seu conteúdo - outra tarefa às vezes confusa). Em vez de fazer isso, acho que faz muito mais sentido especificar diretamente o que você deseja, em vez de dar uma resposta que é em si uma pergunta. Se você deseja os padrões do IE7, use IE = 7, em vez de IE = EmulateIE7. (Observe que isso não significa que você não deve usar um DOCTYPE - você deve.)

stefan.s
fonte
como mudar o modo do navegador?
Vishnudev K
a sentença modo de navegação é confusa
Justiça punho
@JusticeFist Sim, você está certo, obrigado. Eu tentei melhorar isso.
stefan.s
1
@VishnudevK A única maneira que eu sei é usar as ferramentas de desenvolvedor. Mas você provavelmente quer uma solução programática.
stefan.s
9

Tente este metatag:

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

Ele deve forçar o IE8 a renderizar como modo padrão do IE8, mesmo que a opção "Exibir sites da intranet no modo de compatibilidade" esteja marcada [na intranet ou em todos os sites], tentei por conta própria no IE 8.0.6

Ala 'Alnajjar
fonte
15
Não, não tem.
Dennis C
11
Na verdade, isso está correto, mas DEVE aparecer antes de toda e qualquer tag META na página ou não funcionará.
Michael Irigoyen
2
Isso não funciona para mim. Tanto quanto eu posso dizer IE8s "locais de exibição intranet no modo de compatibilidade" é un-overrideable
codeulike
6
(para esclarecer: Ele trabalha para o modo de documento, mas não modo de navegador Assim prestação é fixa, mas o navegador ainda finge ser IE7.)
codeulike
7

O administrador do sistema resolveu esse problema desmarcando a caixa globalmente para nossa organização. Os usuários nem precisavam fazer logoff.

insira a descrição da imagem aqui

James Lawruk
fonte
1
Essa solução funciona perfeitamente se todos os sites na intranet puderem usar os mais recentes padrões da web. No entanto, se alguns não puderem, esse método irá inadvertidamente quebrá-los ... eu abordaria com cautela.
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ
4

Encontrei uma resposta funcional que permite substituir o Modo de Exibição de Compatibilidade da Intranet verificado. Basta adicionar no evento OnInit da sua página esta linha (nenhuma meta ou web.config customHeader precisa):

Response.AddHeader("X-UA-Compatible", "IE=EmulateIE8");
Cyrille Perrot
fonte
1
Resposta específica da plataforma de desenvolvimento ... sem especificar a plataforma. Acho que você está falando sobre o Visual Studio .NET? Tanto quanto eu posso dizer 'o OnInit' evento não existe (em Javascript, Java, PHP, ....)
Stijn de Witt
3

Tente colocar o seguinte no cabeçalho:

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

Cortesia de Paul Irish em HTML5 Boilerplate (mas também funciona em XHTML Transitional).

Gabe
fonte
3

Consegui substituir o modo de compatibilidade especificando a metatag como A PRIMEIRA ETIQUETA seção na cabeça, não apenas a primeira metatag, mas como e somente a MUITO PRIMEIRA ETIQUETA .

Agradeço ao @ stefan.s por me colocar na sua excelente resposta. Antes de ler, eu tinha:

ISTO NÃO FUNCIONOU

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

moveu a tag link para fora do caminho e funcionou

ISSO FUNCIONA :

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

Portanto, um cliente do IE8 configurado para usar a compatibilidade renderiza a página no modo Padrão do IE8 - o conteúdo = 'IE = 9' significa usar o padrão mais alto disponível até o IE9, inclusive.

PeteS_UK
fonte
2

Esta não é exatamente uma solução, mas acho que é a melhor. Nos sites da intranet, dizemos às pessoas que ele só pode ser acessado pelo Firefox; não aceitamos os usuários do IE por aqui. Verifique o agente do usuário no lado do servidor ou cliente e negue-lhes acesso a partir do IE. E eu sou um programador .NET.

Caimen
fonte
1
Eu gosto da sua ideia. mas não temos firefox aqui.
Dennis C
22
Pior. Sugestão. Sempre. Isso é tão ruim quanto todos os sites da intranet que são apenas para o IE. Tente fazer um pouco de trabalho extra e trabalhe em todos os navegadores comuns. Não é tão difícil.
precisa saber é o seguinte
2
@ mhenry1384 Gostaria de explicar por que é uma péssima sugestão ter um sistema de intranet bloqueado? Você não precisa dar suporte a quarks para navegadores antigos. Você sabe que seus usuários terão a experiência pretendida. Não é um sistema público, quem se importa, você ainda suporta o IE 5.5? Eu digo aos meus usuários públicos para atualizar. Eu não deveria estar perdendo meu tempo em sistemas de back-end de qualquer maneira, é o público que precisa de mim. Não é como se eu o bloqueasse no IE 6 e exigisse ActiveX como alguns. Por exemplo, meu sistema permite o Firefox 6 e superior. Portanto, se o Firefox 27 for lançado, ele ainda funcionará. Me diminuiu ou fez um argumento real.
Caimen 7/03/12
2
Todo site de intranet que usei bloqueado para um navegador específico está bloqueado no IE. Isso me deixa louco, porque eu odeio o IE tanto quanto o próximo cara. Forçar seus usuários a usar o navegador de sua escolha (não o deles), mesmo que seja qualquer coisa, exceto o IE, parece contrário à web, até à web da intranet. Normalmente, não é tão difícil conseguir um site funcionando no IE7 / 8/9, especialmente se você usar bibliotecas como o jQuery. Deixe os usuários usarem o que querem.
precisa saber é o seguinte
2
Um site criado para o Firefox 10, por exemplo, na minha experiência quase sempre funciona perfeitamente bem no IE9 sem modificação. Portanto, restringir os usuários do IE9 significa que há algo mais acontecendo. Indica que você está em uma missão idealógica, e não alguém tentando escrever um bom software para a web. Se foi apenas uma questão de não ter tempo para testar navegadores que não sejam o Firefox, você também restringe as pessoas ao uso do Opera? [Desculpe por ser tão prolixo. Eu deveria voltar para corrigir este problema maldito IE8 Eu estou tendo ... :-)]
mhenry1384
1

Eu tinha lutado com esse problema e queria ajudar a fornecer uma solução e uma visão únicas.

Certas estruturas baseadas em AJAX injetam javascripts e folhas de estilo no início do <head> e isso parece impedir a solução bem estabelecida de meta tag de funcionar corretamente. Nesse caso, descobri que a injeção direta no cabeçalho de resposta HTTP, bem como a resposta de Andras Csehi, resolverá o problema.

No entanto, para aqueles que usam Java Servlets, uma boa maneira de resolver isso é usar um 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
fonte
1

Podemos resolver esse problema no ambiente Spring-Apache-tomcat adicionando uma única linha no 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;
}

Referência de - Como criar filtro e modificar cabeçalho de resposta Ele aborda como podemos resolver esse problema através de um RequestInterceptor (Spring).

JackSparrow
fonte
0

Se você deseja que seu site force o modo de padrões do IE 8, use esse metatag junto com um DOCTYPE válido:

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

Observe o valor "EmulateIE8" em vez do simples "IE8".

De acordo com os desenvolvedores do IE, isso deve: "Exibir DOCTYPEs de padrões no modo de padrões do IE8; Exibir quirks DOCTYPEs no modo de quirks. Use essa tag para substituir a exibição de compatibilidade em máquinas clientes e forçar os padrões aos padrões do IE8".

mais informações sobre esta postagem no blog do IE: http://blogs.msdn.com/b/ie/archive/2008/08/27/introducing-compatibility-view.aspx

ashtonium
fonte
0

Esta pergunta é uma duplicata do modo de navegador Force "Internet Explorer 8" na intranet .

As respostas indicam que não é possível desativar a exibição de compatibilidade (no lado do servidor) - https://stackoverflow.com/a/4130343/24267 . Certamente parece ser esse o caso, pois nenhuma das sugestões que tentei funcionou. No IE8, o "Modo navegador" é definido para a visualização de compatibilidade com o Internet Explorer 8, independentemente do tipo de cabeçalho compatível com X-UA que você envia.

Eu tive que fazer um tratamento especial para o IE7 e o modo de compatibilidade, que causou a renderização do navegador usando o IE8, mas relatou que era o IE7, quebrei meu código. Foi assim que corrigi meu código (sei que é um hack horrível e devo testar recursos que não sejam versões do 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, esse é o IE8 no modo de compatibilidade.
    isIE8 = verdadeiro;
}
mhenry1384
fonte
0

Teve o mesmo problema. Funcionou usando

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

Adicione isso dentro da tag principal da sua página (segmentando a versão do IE desejada):

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

Observe que isso NÃO mudará o fato de o navegador informar que está no modo de compatibilidade (chamado de modo do navegador), mas a página será renderizada no modo de padrões do IE8. Se ainda não renderizar como você deseja, provavelmente é porque você tem o javascript que está erroneamente verificando a versão do IE. Consulte a postagem do blog a seguir para determinar de qual propriedade você deve estar desativando, porque, mesmo se você definir a tag meta X-UA-Compatible, a sequência do agente do usuário continuará dizendo MSIE 7.0 .

No meu caso, para a correção, tive que adicionar uma verificação ao modo de compatibilidade do IE7. Fiz isso usando um código javascript simples:

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

Para qualquer outra pessoa que estiver lendo isso que deseja desabilitar isso via GPO para todos os usuários, esta é a configuração:

Configuração do computador / Modelos administrativos / Componentes do Windows / Internet Explorer / Exibição de compatibilidade / Ativar o modo de padrões do Internet Explorer para intranet local

embora a edição web.config tenha corrigido para mim.

Schrodo_Baggins
fonte
Para ir para o Editor de Diretiva de Grupo Local , você pode executar o gpedit.msc em Executar.
ROMANIA_engineer
0

Alterar os cabeçalhos em .htaccess

BrowserMatch MSIE ie
Header set X-UA-Compatible "IE=Edge,chrome=1" env=ie

Encontre a solução para este problema aqui: https://github.com/h5bp/html5-boilerplate/issues/378

user1858301
fonte
Nem todo mundo está usando Apache
Burjua
0

O comentário de Stefan S sobre o modo de documento versus o modo de navegador foi muito pertinente para o meu problema.

Eu tenho os metadados X-UA-Content na página, mas estava testando a versão do navegador no lado do cliente navigator.appVersion. Este teste não reflete os metadados porque está dando ao modo navegador e não ao modo documento.

A resposta para mim foi testar document.documentModealgo como:

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

Agora, minha meta meta X-UA-Content reflete no meu teste do navegador.

Por que faço uma coisa tão desaprovada como testar o navegador? Rapidez. Vários dos meus suplementos jQuery, como o tablesorter, são muito lentos no IE6 / 7 e quero desativá-los. Não tenho certeza de que o teste de recursos do navegador possa me ajudar a resolver isso de outra forma.

Herc
fonte