Использование PHP для записи значения в заголовок условно - PullRequest
2 голосов
/ 10 августа 2011

Я довольно новичок в 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», если его нет.

Ответы [ 3 ]

4 голосов
/ 10 августа 2011

Вы можете получить значение с помощью 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']);
}

Другой подход заключается в добавлении заголовка в переменную окружения с помощью rewriterule в .htaccess, а затем в обычном порядке $_SERVER:

RewriteRule .* - [E=X-OPERAMINI-PHONE-UA:%{HTTP:X-OperaMini-Phone-UA}]
2 голосов
/ 10 августа 2011

Вы также можете использовать $_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']
}
1 голос
/ 18 мая 2015

В октябре 2012 года 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'];
}
...