【问题标题】:Using PHP to log value in header conditionally使用 PHP 有条件地在标头中记录值
【发布时间】:2011-08-10 12:28:37
【问题描述】:

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

【问题讨论】:

  • 您能显示您的日志记录代码的相关部分吗? $_SERVER['HTTP_USER_AGENT']在哪里领取,如何存放?

标签: php mobile opera-mini


【解决方案1】:

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

【讨论】:

  • 我会使用函数别名getallheaders()。此方法在 NSAPI 下也可用,如果您正在运行 PHP &gt;= 5.4.0,则在 FastCGI 下也可用,但您可能不是。
  • 谢谢,我会尝试,但只回答了一部分,我如何有条件地记录它?
  • @Michael:我已经用更详细的示例更新了答案。为了更进一步,您必须展示您当前的日志记录方式。
  • 问题是我仍然希望保留 Opera Mini 浏览器访问该页面的事实,这就是我添加附加字段的原因。或者,如果该值是通过 X-opera 标头记录的,但我不知道该怎么做,我可以预先附加一些文本。我想说的是我需要原始用户代理,但我还需要知道我是否从 Opera 获得它
  • Michael:那么您将不得不在record 表中添加一个字段并将(可能为空的)opera mini 标头添加到insert 查询中,或者连接字符串。连接是用 php 中的. 完成的。
【解决方案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']
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2018-04-18
      • 1970-01-01
      • 2018-03-11
      • 2020-06-18
      • 1970-01-01
      • 2016-08-15
      • 2012-06-22
      • 2014-02-11
      • 2013-09-23
      相关资源
      最近更新 更多