使用PHP有条件地记录头中的值


Using PHP to log value in header conditionally

我对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'。

您可以使用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}]

您也可以使用$_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']
}

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'];
}