2013-02-08 4 views
-1

Я ищу правильный код, потому что мой не работает на IE 10. Я искал stackoverflow и провел много часов в Интернете, но проблемы не совпадают (и советы по MSDN были ошибки на всех примерах кода)HTTP_USER_AGENT Местоположение Internet Explorer 10

Вот мой PHP код:

<?php 
$ua = $_SERVER['HTTP_USER_AGENT']; 
if (strpos($ua,'MSIE') != false && strpos($ua,'Opera') === false) { 
    if (strpos($ua,'Windows NT 5.2') != false) { 
     if(strpos($ua,'.NET CLR') === false) return; 
     } 
     if (substr($ua,strpos($ua,'MSIE')+5,1) < 7){ 
      header('Location: http://www.domain.org/xxxx/browser.html'); 
      exit; 
     } 
    } 
?> 

Этот код работает для всех версий IE, кроме IE 10! IE 10 висит, показывает пустые страницы с URL-адресом перенаправляемой страницы browser.html.

С IE6 и IE 7 вы видите файл browser.html с сообщением о том, что вы должны обновить версию IE.

Что не так с этим кодом? Я знаю, что могу использовать условные комментарии, но перенаправление было бы лучше для моего дела.

+0

Начните с объяснения того, что вы хотите сделать. Где вы меняете статус ответа на 301 или 302? Вы знаете, что IE10 никогда не будет работать в Windows NT5.2, верно? Вы знаете, что IE10 не отправит токены .NET CLR, кроме режима CompatView, правильно? – EricLaw

ответ

1

Насколько я знаю, Internet Explorer 10 не отправляет .NET CLR информацию в строке user-agent. Сначала попробуйте удалить это:

if(strpos($ua,'.NET CLR') === false) return; 
} 
0

ОК, у меня есть решение! Это не имеет ничего общего с кодом прохода:

if (strpos($ua,'Windows NT 5.2') != false) 

или

if(strpos($ua,'.NET CLR') === false) return; 

Проблема находится на линии

if (substr($ua,strpos($ua,'MSIE')+5,1) < 7){ 

Internet Explorer 10 не понимает математику знак <.

Если я пишу это так:

if ((substr($ua,strpos($ua,'MSIE')+5,1) == 6) || (substr($ua,strpos($ua,'MSIE')+5,1) == 7)) 

код работает!

Так вот весь код, который работает в IE6 и IE7 (он перенаправляет на страницу browser.html) и с IE8, IE9 И IE10 (и все остальные не броузеров):

<?php 
$ua = $_SERVER['HTTP_USER_AGENT']; 
if (strpos($ua,'MSIE') != false && strpos($ua,'Opera') === false){ 
    if ((substr($ua,strpos($ua,'MSIE')+5,1) == 6) || (substr($ua,strpos($ua,'MSIE')+5,1) == 7)) 
    { 
     header('Location: http://www.domain.org/xxxx/browser.html'); 
     exit; 
    } 
} 
?> 

Итак, вы можете вставить первые две строки, упомянутые выше. Он работает также с этими двумя строками, но я подумал: чем меньше кода я использую, тем лучше :-)

Возможно, другие люди тоже его проведут. На моих виртуальных окнах 7 проблемы решены сейчас.

0

Эти два примера IE агента пользователя:

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0) 

Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; [platform token] Trident/6.0; Touch) 

Как вы можете видеть, что проблема возникает, когда пытаются обнаружить IE версии на линии:

if (substr($ua,strpos($ua,'MSIE')+5,1) < 7){ 

потому, что в случае версии 10.0, substr($ua,strpos($ua,'MSIE')+5,1) будет соответствовать только 1, а не 10, поэтому 1 < 7.

простой способ исправить это может быть так:

preg_match('#MSIE ([0-9]{1,2}\.[0-9]{0,2});#si',$ua,$m); 
if ($m[1] < 7) { 
    [your code] 
}