2

我对 PHP 很陌生,所以请多多包涵。

我正在尝试记录访问我网站的手机的用户代理。我通过检查 $_SERVER['HTTP_USER_AGENT'] 值来做到这一点。

遇到一个小问题,我注意到如果该人通过 opera mini 访问我的网站,然后 opera mini 将实际用户代理移动到标识为 X-OperaMini-Phone-UA 的标头值中:

因此,我正在寻找 PHP 代码,它将从标头(如果存在)中提取它,如果没有,则将其标识为 NA 以用于数据库日志记录。

这是我目前用于记录的代码,由其他人编写

<?php
mysql_connect('server.com', 'dbuser', 'dbpass');
$url = mysql_real_escape_string("http://$_SERVER[SERVER_NAME]$_SERVER[REQUEST_URI]");
$fn = mysql_real_escape_string($_SERVER['SCRIPT_NAME']);
$ip = mysql_real_escape_string($_SERVER['REMOTE_ADDR']);
$ref = mysql_real_escape_string($_SERVER['HTTP_REFERER']);
$ua = mysql_real_escape_string($_SERVER['HTTP_USER_AGENT']);
mysql_select_db('db');
mysql_query("INSERT INTO `record` VALUES ('$url', '$fn', NOW(),'$ip', '$ref','$ua')");
?>

所以,现在我添加了一些名为opera_user_agent 的字段,如果有,我想记录Opera 用户代理,如果没有,则使用'NA'。

4

3 回答 3

4

您可以使用getallheaders获取值:

$headers = getallheaders();

if (array_key_exists("X-OperaMini-Phone-UA", $headers))
{
    $ua = mysql_real_escape_string($headers["X-OperaMini-Phone-UA"]);
}
else 
{
    $ua = mysql_real_escape_string($_SERVER['HTTP_USER_AGENT']);
}

另一种方法是使用 .htaccess 中的重写器将标头添加到环境变量中,然后$_SERVER像往常一样通过以下方式获取它:

RewriteRule .* - [E=X-OPERAMINI-PHONE-UA:%{HTTP:X-OperaMini-Phone-UA}]
于 2011-08-10T12:37:44.420 回答
2

您也可以使用$_SERVER['HTTP_X_OPERAMINI_PHONE_UA']

if(!empty($_SERVER['HTTP_X_OPERAMINI_PHONE_UA'])){
    // use $_SERVER['HTTP_X_OPERAMINI_PHONE_UA']
}else{
    // use default $_SERVER['HTTP_USER_AGENT']
}
于 2011-08-10T13:07:31.093 回答
1

2012 年 10 月,Opera 建议使用名为Device-Stock-UA. 在那之后,新的 Opera Mini/Mobile 浏览器将使用Device-Stock-UA新旧X-OperaMini-Phone-UA标题。 https://dev.opera.com/blog/introducing-device-stock-ua/

该参数定义如下:

此标头的值与运行 Opera Mobile 或 Mini 的操作系统捆绑的普通用户代理的值相匹配。

关于那个更新,我创建了这个函数:

public static function getUserAgentDevice() {
    if (isset($_SERVER['HTTP_X_OPERAMINI_PHONE_UA'])) {
        return $_SERVER['HTTP_X_OPERAMINI_PHONE_UA'];
    }
    if (isset($_SERVER['HTTP_DEVICE_STOCK_UA'])) {
        return $_SERVER['HTTP_DEVICE_STOCK_UA'];
    }
    return $_SERVER['HTTP_USER_AGENT'];
}
于 2015-05-18T14:43:22.310 回答