为什么我的PHP IF/ELSE语句不能用于确定用户的操作系统?


Why won't my PHP IF/ELSE statement work for determining the users operating system?

我试图创建一个页面,将重定向用户取决于他们的操作系统。首先,我需要它能够将Windows XP用户重定向到位置A,其他Windows用户重定向到位置B, Mac用户重定向到位置c。

我用它来确定Windows/Mac运行良好:

<?php
$useragent = $_SERVER['HTTP_USER_AGENT'];
if (strstr($useragent,'Win')) {
$os='<META HTTP-EQUIV="Refresh"
  CONTENT="1; URL=windows.php">';
} else {
$os='<META HTTP-EQUIV="Refresh"
  CONTENT="0; URL=mac.php">';
}
print "$os";
?>

工作正常,但后来我试图为Windows NT 5.1 (Windows XP)添加一条语句

<?php
$useragent = $_SERVER['HTTP_USER_AGENT'];
if (strstr($useragent,'Windows NT 5.1')) {
$os='<META HTTP-EQUIV="Refresh"
  CONTENT="1; URL=windows-xp.php">';
} else if (strstr($useragent,'Win')) {
$os='<META HTTP-EQUIV="Refresh"
  CONTENT="1; URL=windows.php">';
} else {
$os='<META HTTP-EQUIV="Refresh"
  CONTENT="0; URL=mac.php">';
}
print "$os";
?>

我不相信我这样做是最好的,但是任何对我的帮助都会让我非常感激。

谢谢!

引用我上面的评论:

依赖User-Agent可能有一些合法的用途,即使这通常是一个坏主意。例如,在某种帮助/手册页面上显示来自正确操作系统的屏幕截图。或者首先为最合适的软件版本定位下载链接。只要确保这只是为了美观,并且有一个相同的默认选项。

例如,特定于Windows的页面也应该包括MacOS下载的链接,即使Windows XP的下载设置在第一/最突出的位置。此外,默认版本还应该提供所有下载链接,并且应该完全可操作。例如,它可以相当于与您的软件的最常用版本相对应的页面。

$browser = get_browser(null, true);
switch ($browser->platform) {
case 'WinXP':
    // XP-specific
    break;
case 'WinVista':
    // Vista-specifict
    break;
case 'MacOSX':
    // OSX default
    break;
default:
    // Generic default
}

来自PHP文档:

为了使其工作,您的browscap配置设置Php.ini必须指向浏览器上的browscape .ini文件的正确位置您的系统。

browscape .ini没有与PHP捆绑在一起,但是您可以找到一个最新的»

虽然browscape .ini包含许多浏览器的信息,但它依赖于用户更新以保持数据库的最新状态。文件格式为相当不言自明的。

您可以遍历这个用户代理数组和匹配的操作系统,然后根据结果重定向用户。

    $OSList = array(
    // Match user agent string with operating systems
    'Windows 3.11' => 'Win16',
    'Windows 95' => '(Windows 95)|(Win95)|(Windows_95)',
    'Windows 98' => '(Windows 98)|(Win98)',
    'Windows 2000' => '(Windows NT 5.0)|(Windows 2000)',
    'Windows XP' => '(Windows NT 5.1)|(Windows XP)',
    'Windows Server 2003' => '(Windows NT 5.2)',
    'Windows Vista' => '(Windows NT 6.0)',
    'Windows 7' => '(Windows NT 7.0)',
    'Windows NT 4.0' => '(Windows NT 4.0)|(WinNT4.0)|(WinNT)|(Windows NT)',
    'Windows ME' => 'Windows ME',
    'Search Bot'=>'(nuhk)|(Googlebot)|(Yammybot)|(Openbot)|(Slurp)|(MSNBot)|(Ask Jeeves/Teoma)|(ia_archiver)'
    );

有几件事,当您使用strstr()时,一个简单的strpos就可以了。我也会把它放在一个简单的switch语句中,这样你就可以很容易地设置一个默认/匹配多个条件。

其次,在PHP中正确的重定向方法是使用header()命令,如下所示:
header("Location: windows.php");

把它们放在一起,你就得到了这个:

$useragent = $_SERVER['HTTP_USER_AGENT'];
switch(true) {
    // Windows XP
    case stripos($useragent, 'Windows NT 5') !== false: 
        header("Location: windowsxp.php");
        break;
    case stripos($useragent, 'Windows ') !== false: // Windows whatever
        header("Location: windows.php");
        break;
    case stripos($useragent, 'mac') !== false:
    default :
        // Default, maybe do nothing?
}
阅读PHP switch语句,希望你能理解它的布局。正如其他人所说,依赖useragent并不完美,但对于您的简单下载情况,它应该是好的。