Итак, вот мое затруднение.У меня есть сайт, который очень чувствителен к пользовательским агентам.Совершенно важно, чтобы на сайт был отправлен правильный пользовательский агент, иначе сайт не будет работать для этого пользователя.Сайт работает нормально, если пользователь не перенаправлен туда через постоянный редирект.
Вот где он становится интересным.Видите ли, Firefox и Chrome не имеют проблем.Но IE начинает врать о том, какую версию браузера вы используете, как только увидит статус и изменение домена.У меня есть клиент (очень большой медленный клиент), связывающий мой сайт извне с помощью перманентного перенаправления.И я не думаю, что у этого клиента есть возможность изменить это прямо сейчас.Таким образом, я застрял с этим, и мое обнаружение в браузере становится проблематичным, когда IE перестает быть:
Mozilla / 5.0 (совместимый; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 5.0)
до:
Совместимость с Mozilla / 4.0;MSIE 7.0;Windows NT 6.1;WOW64;Trident / 5.0;SLCC2;.NET CLR 2.0.50727;.NET CLR 3.5.30729;.NET CLR 3.0.30729;Медиа Центр ПК 6.0;.NET4.0C;InfoPath.3
Некоторые вещи, которые я пробовал: Добавлен метатег, который изменяет механизм рендеринга:
<meta content="IE=7" http-equiv="X-UA-Compatible" />
Работает в IE 8, но 9 игнорирует его.Пробовал обнаруживать разные версии .net framework, но это не всегда надежно.Пробовал использовать тэг Canvas в Javascript, но это сломало его только в IE 7, а иногда и 8.
Я думаю, что должен быть какой-то заголовок, который я могу добавить к нему, но я не знаюлюбого.
Кто-нибудь видел это раньше?Есть ли функциональный обходной путь?
Редактировать: Кто-то предложил модернизатор.Это потрясающая идея.
Еще одна вещь, которую я сделал, чтобы решить эту проблему, была переписать мой скрипт обнаружения браузера.
Вот, если кто-нибудь когда-нибудь столкнется с подобной проблемой: он грязный, но работает.
function getBrowser() {
//shamlessly "borrowed" from the manual at http://php.net/manual/en/function.get-browser.php
//Needed some cleanup.
//Still needs some cleanup
$u_agent = $_SERVER['HTTP_USER_AGENT'];
$bname = 'Unknown';
$platform = 'Unknown';
$version = "";
$xploded = explode(';',$u_agent);
//pretty($xploded);
// finally get the correct version number
$known = array('Version', $ub, 'other');
$pattern = '#(?<browser>' . join('|', $known) .
')[/ ]+(?<version>[0-9.|a-zA-Z.]*)#';
if (!preg_match_all($pattern, $u_agent, $matches)) {
// we have no matching number just continue
}
// see how many we have
$i = count($matches['browser']);
if ($i != 1) {
//we will have two since we are not using 'other' argument yet
//see if version is before or after the name
if (strripos($u_agent, "Version") < strripos($u_agent, $ub)) {
$version = $matches['version'][0];
} else {
$version = $matches['version'][1];
}
} else {
$version = $matches['version'][0];
}
// check if wfunction getBrowser() {
$u_agent = $_SERVER['HTTP_USER_AGENT'];
$bname = 'Unknown';
$platform = 'Unknown';
$version = "";
//First get the platform?
if (preg_match('/linux/i', $u_agent)) {
$platform = 'linux';
} elseif (preg_match('/macintosh|mac os x/i', $u_agent)) {
$platform = 'mac';
} elseif (preg_match('/windows|win32/i', $u_agent)) {
$platform = 'windows';
}
// Next get the name of the useragent yes seperately and for good reason
if (preg_match('/MSIE/i', $u_agent) && !preg_match('/Opera/i', $u_agent)) {
$bname = 'Internet Explorer';
$ub = "MSIE";
} elseif (preg_match('/Firefox/i', $u_agent)) {
$bname = 'Mozilla Firefox';
$ub = "Firefox";
} elseif (preg_match('/Chrome/i', $u_agent)) {
$bname = 'Google Chrome';
$ub = "Chrome";
} elseif (preg_match('/Safari/i', $u_agent)) {
$bname = 'Apple Safari';
$ub = "Safari";
} elseif (preg_match('/Opera/i', $u_agent)) {
$bname = 'Opera';
$ub = "Opera";
} elseif (preg_match('/Netscape/i', $u_agent)) {
$bname = 'Netscape';
$ub = "Netscape";
}
// finally get the correct version number
$known = array('Version', $ub, 'other');
$pattern = '#(?<browser>' . join('|', $known) .
')[/ ]+(?<version>[0-9.|a-zA-Z.]*)#';
if (!preg_match_all($pattern, $u_agent, $matches)) {
// we have no matching number just continue
}
// see how many we have
$i = count($matches['browser']);
if ($i != 1) {
//we will have two since we are not using 'other' argument yet
//see if version is before or after the name
if (strripos($u_agent, "Version") < strripos($u_agent, $ub)) {
$version = $matches['version'][0];
} else {
$version = $matches['version'][1];
}
} else {
$version = $matches['version'][0];
}
// check if we have a number
if ($version == null || $version == "") {
$version = "?";
}
$bname = strtolower($bname);
$windows_version = floatval(trim(str_ireplace('Windows NT','',$xploded[2]) ));
//Sloppy hack for dealing with IE 9, specifically.
$trial = intval($version);
if($windows_version == 6.1 && $bname == 'internet explorer' && $trial == 7){
//the browser is lying to you.
//print "We are being lied to<br>";
$version = 9.0;
}
//print 'windows version is......'.$windows_version.'<br>';
//print 'browser id is......'.$bname.'<br>';
//print 'raw version is......'.$version.'<br>';
return array(
'test'=>'test',
'name' => $bname,
'version' => intval($version)
);
}