На главную страницу

Функции и методы для работы с адресами и переменными НТТР

• gethostbyaddr - получает имя Internet-хоста, соответствующее данному IP-адресу.

<?php
$hostname = gethostbyaddr($_SERVER['REMOTE_ADDR']);
echo 'Имя Интернет-хоста с IP-адресом '.$_SERVER['REMOTE_ADDR'].' : '.$hostname;
?>

• gethostbyname - получает IP-адрес, соответствующий имени данного Internet-хоста.

<?php
$hostname = 'localhost';
$ip = gethostbyname($hostname);
echo "IP-адрес $hostname: $ip";
?>

• gethostbynamel - получает список IP-адресов, соответствующих имени данного Internet-хоста.

<?php
  $hosts = gethostbynamel('www.example.com');
  print_r($hosts);
?>

Результат:

Array
(
    [0] => 192.0.34.166
)

• checkdnsrr - проверяет записи DNS, соответствующие Internet-хосту или IP-адресу (сheckdnsrr (host, type);). Ищет DNS для записи типа type, соответствующего host. Возвращает TRUE, если какие-либо записи найдены; возвращает FALSE, если записи не были найдены или если возникла ошибка.

Host это может быть либо IP-адрес в нотации dotted-quad, либо имя хоста.

Тype может быть: A, MX, NS, SOA, PTR, CNAME или ANY. По умолчанию MX.

Примечание: Эта функция не реализована для платформ Windows.


• dns_get_record - разбирает записи ресурса DNS, ассоциированным с именем хоста.

Пример использования dns_get_record():

>?php
$result = dns_get_record("htmlweb.ru");
print_r($result);
?>

• getmxrr - получает MX-записи, соответствующие имени данного Internet-хоста (getmxrr (hostname, mxhosts, weight);). Ищет DNS для MX-записей, соответствующих hostname. Возвращает TRUE, если найдены любые записи; возвращает FALSE, если никаких записей не было найдено или если возникла ошибка.

Список найденных MX-записей помещается в массив mxhosts. Если массив weight задан, он будет заполнен полученной weight-информацией.


• header - используется для отправки необработанных HTTP-шапок (header (string);).

Пример:

header("Location: http://www.example.com/"); /* Redirect browser */
exit;                 /* Убедитесь, что последующий код не
                         выполняется, когда мы перенаправляем. */

Примечание: HTTP/1.1 требует абсолютного URI в качестве аргумента для Location: включая схему, имя хоста и абсолютный путь, но некоторые клиенты принимают относительные URI. Как правило вы можете сами использовать $_SERVER['HTTP_HOST'], $_SERVER['PHP_SELF'] и dirname() для создания абсолютного URI из относительного:

header("Location: http://".$_SERVER['HTTP_HOST']
                      .dirname($_SERVER['PHP_SELF'])
                      ."/".$relative_url);

header() обязана вызываться до отправки любого вывода: нормальными ли тэгами HTML, пустыми строками в файле или из PHP. Очень частой ошибкой является чтение кода функциями include() или require(), или другой функцией доступа к файлу, и наличие пробелов или пустых строк, которые выводятся до вызова header(). Та же проблема возникает при использовании едингого PHP/HTML-файла.


• headers_sent - проверяет отправлены ли HTTP-заголовки клиенту. Использование данной функции позволит избежать сообщений об ошибках, связанных повторной отправкой HTTP-заголовков.

Пример. Пример использования headers_sent():

<?php
// Если заголовки еще не отправлены, добавить
if (!headers_sent()) {
    header('Location: http://www.example.com/');
    exit;
}
// Обратите внимание, что $filename и $linenum передаются для последующего
// использования. Не устанавливайте их предварительно!
if (!headers_sent($filename, $linenum)) {
    header('Location: http://www.example.com/');
    exit;

// Обычно здесь идет обработка ошибок.
} else {
    echo "Заголовки уже отправлены в $filename на строке $linenum\n" .
          "Редирект невозможен, пожалуйста нажмите <a " .
          "href=\"http://www.example.com\">Здесь</a> самостоятельно\n";
    exit;
}
?> 

Разбор адресной строки вызова WEB-страницы

Пусть дан следующий адрес WEB-страницы:

http://www.protoart.ru/ru/main/event/exhibit/show_event.shtml?event_id=1054&sec..


Часто в литературе в качестве примера использования регулярных выражений приводится пользовательская функция определения доменного имени в адресной строке:

function domen($url) #Функция определения доменного имени из адреса WEB-страницы
 {
	$string = str_replace("http://", "", $string);
	$pattern_domen = "|[a-z0-9_\-.]+[a-z]{2,6}|is";
	preg_match_all($pattern_domen, $string, $domen, PREG_PATTERN_ORDER);
	return $domen[0][0];
 }

Она работает, но зачем ее применять, если PHP имеет достаточный набор функций для таких случаев.

Вариант этой программы с использованием стандартных функций будет выглядеть так:

function domen ($url) #Функция определения доменного имени из адреса WEB-страницы
  {
   if(!strpos($url,"http://")) {$big_url = "http://".$url;};
   $atr_url = parse_url($big_url);
   return $atr_url[host];
  }

Стандартные функции PHP для обработки WEB-адреса

• basename — Возвращает имя файла из указанного пути

<?php
$path = "/home/httpd/html/index.php";
$file = basename($path);         // $file содержит "index.php"
$file = basename($path, ".php"); // $file содержит "index"
?> 

• dirname - Возвращает имя каталога из указанного пути

<?php
$path = "/etc/passwd";
$file = dirname($path); // $file содержит "/etc"
?>

<?php
dirname('c:/'); // вернет 'c:'
?> 

• pathinfo() - возвращает ассоциативный массив, который содержит информацию о пути path. Возвращаемый массив состоит из следующих элементов: dirname, basename и extension.

<?php
$path_parts = pathinfo('/www/htdocs/index.html');

echo $path_parts['dirname'],  "\n"; // вернет '/www/htdocs'
echo $path_parts['basename'], "\n"; // вернет 'index.html'
echo $path_parts['extension'],"\n"; // вернет 'html'
?>

Еще пример:

<?php
$path = "../state/home/look.php?key=12";
echo dirname($path); # ../state/home
echo basename($path); # look.php?key=12

$path_parts = pathinfo($path);
echo $path_parts['dirname']; # ../state/home
echo $path_parts['basename']; #  look.php?key=12
echo $path_parts['extension']; # php?key=12
?>

• parse_url - возвращает ассоциативный массив, который содержит информацию о пути path.

<?php
$url = 'http://username:password@hostname/path?arg=value#anchor';
print_r(parse_url($url));
?>

Результат выполнения данного примера:

Array
(
    [scheme] => http
    [host] => hostname
    [user] => username
    [pass] => password
    [path] => /path
    [query] => arg=value
    [fragment] => anchor
)

• parse_str - Разбирает строку в переменные

Замечание: Для получения текущей строки запроса (QUERY_STRING) может быть использована переменная $_SERVER['QUERY_STRING'].

Если строка запроса представляет собой адрес:

http://www.mysite.ru/test/index.php?id=1&test=wet&id_theme=512
то в элемент $_SERVER['QUERY_STRING'] попадёт весь текст после знака "?". Например, при обращении к скрипту, представленному ниже, помещая в строке запроса произвольный текст после знака "?" получим страницу с введённым текстом.

<?php
  echo $_SERVER['QUERY_STRING']; // id=1&test=wet&id_theme=512
?> 

Значения переменных в запросе определяется через функцию parse_str:

<?php
$str = "first=value&arr[]=foo+bar&arr[]=baz";

parse_str($str);
echo $first;  // value
echo $arr[0]; // foo bar
echo $arr[1]; // baz

parse_str($str, $output);
echo $output['first'];  // value
echo $output['arr'][0]; // foo bar
echo $output['arr'][1]; // baz
?> 

Еще пример:

<? php
$url = 'http://username:password@hostname/path?arg=value&time=12#anchor';
$part = parse_url($url);
echo $part[scheme];# http
echo $part[host];# hostname
echo $part[user];# username
echo $part[pass];# password
echo $part[path];# /path
echo $part[query];# arg=value&time=12
echo $part[fragment];# anchor

parse_str($part[query]);
echo $arg;  # value
echo $time; # 12
?> 

Если Вы передаете только одно значение, то можно обойтись и без использования переменной:

<? php
$path = "../state/home/look.php?12";
echo $part[query]; # 12
?> 

• realpath - Возвращает канонизированный абсолютный путь к файлу. Раскрывает все символические ссылки, переходы типа '/./', '/../' и лишние символы '/' в пути path, возвращая канонизированный абсолютный путь к файлу. В этом пути не будет символических ссылок и компонентов типа '/./' или '/../'. Возвращает FALSE при неудаче, например, если файл не существует.

<? php
$real_path = realpath("user.php");
echo $real_path; #C:\www\mysite\users\user.php
echo getcwd(); #C:\www\mysite\users
?> 

Пример разбора адресной сроки WEB-страницы на элементы с помощью стандартных функций PHP

<? php
$url = 
"http://www.protoart.ru/ru/main/event/exhibit/show_event.shtml?event_id=1054&sec..";
echo "Исходный URL: ".$url."<br>";
$atr_url = parse_url($url);           // Формирование массива элементов WEB-адреса
$scheme = $atr_url[scheme];           echo "Сетевой протокол: ".$scheme."<br>";
$domen = $atr_url[host];              echo "Домен: ".$domen."<br>";
$path_filename = $atr_url[path];      // Полное имя к файлу
$path = dirname($path_filename);      echo "Путь к файлу: ".$path."<br>";
$filename = basename($path_filename); echo "Имя файла: ".$filename;
$query = $atr_url[query];             echo "Переменные запуска: ".$query."<br>";
parse_str($query);             echo " Переменная ‘event_id’ = ".$event_id."<br>";
?>

В результате работы программы получим:

Исходный URL:
http://www.protoart.ru/ru/main/event/exhibit/show_event.shtml?event_id=1054&sec..
Сетевой протокол: http
Домен: www.protoart.ru
Путь к файлу: /ru/main/event/exhibit
Имя файла: show_event.shtml
Параметры запуска: event_id=1054&sec..
Переменная ‘event_id’ = 1054

Работу с IP-адресами, доменными именами и прочим окружением можно осуществлять также с использованием переменных массива $GLOBALS.


НАИБОЛЕЕ ЧАСТО ИСПОЛЬЗУЕМЫЕ ПЕРЕМЕННЫЕ МАССИВА $GLOBALS
ПеременнаяОписание
$HTTP_USER_AGENTНазвание и версия клиента
$REMOTE_ADDRIP-адрес
$HTTP_X_FORWARDED_FORВнутренний IP-адрес клиента
$REQUEST_METHODМетод запроса (GET или POST)
$QUERY_STRINGПри запросе GET закодированные данные, передаваемые вместе с URL
$REQUEST_URLПолный адрес клиента, включая строку запроса
$HTTP_REFERERАдрес страницы, с которой был сделан запрос
$PHP_SELFПуть к выполняемой программе
$_SERVER['SERVER_NAME']Домен
$_SERVER['REQUEST_URI']Путь
Наиболее часто используемые переменные МАССИВА $GLOBALS или суперглобального массива $_SERVER

Если строка запроса к текущей странице выглядит как:

http://www.mysite.ru/test/index.php?id=1&test=wet&id_theme=512

то, переменные $_SERVER['HTTP_HOST'] и $_SERVER['SERVER_NAME'] будут содержать значение:

www.mysite.ru

переменная $_SERVER['PHP_SELF'] будет содержать значение:

/test/intex.php

переменная $_SERVER['REQUEST_URI'] будет иметь значение:

/test/index.php?id=1&test=wet&id_theme=512

а переменная $_SERVER['QUERY_STRING'] будет содержать значение:

id=1&test=wet&id_theme=512
Восстановление адресной строки вызванной WEB-страницы с использованием переменных массива $_SERVER

Для того чтобы восстановить полный адрес, который был помещен в строке запроса достаточно использовать комбинацию элементов массива $_SERVER:

<? php
echo ‘http://’.$_SERVER[‘SERVER_NAME’].$_SERVER[‘REQUEST_URI’];
?>

Определения IP-адреса клиента

Адрес клиента находится в переменной окружения REMOTE_ADDR, но прочитать его методом опреледения переменных:

$ip=$REMOTE_ADDR;
не возможно, т.к по умолчанию register_globals выключен (off). Поэтому IP-адрес клиента помещается в элемент $_SERVER['REMOTE_ADDR']:
$ip = $_SERVER['REMOTE_ADDR'];

Однако при тестировании в сети переменная вернет IP-адрес клиента или последнего прокси-сервера, через который клиент попал на сервер с программой. Если клиент использует прокси-сервер, узнать его адрес можно при помощи переменной окружения HTTP_X_FORWARDED_FOR, точнее:

$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];

Следовательно IP лучше определить так:

$ip = isset($_SERVER['HTTP_X_FORWARDED_FOR'])
 ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];

Замечание: Но среди прокси-серверов находятся анонимные прокси-серверы, которые позволяют скрывать истинный IP-адрес клиента. Такие серверы не возвращают также и переменную окружения HTTP_X_FORWARDED_FOR. В этом случае прибегают к более сложной функции определения IP-адреса клиента:

<? php
// Функция определения IP-адреса
function PMA_getIp()
{
 global $REMOTE_ADDR;
 global $HTTP_X_FORWARDED_FOR, $HTTP_X_FORWARDED, $HTTP_FORWARDED_FOR,
        $HTTP_FORWARDED;
 global $HTTP_VIA, $HTTP_X_COMING_FROM, $HTTP_COMING_FROM;
 // Get some server/environment variables values
 if (empty($REMOTE_ADDR))
  {
   if (!empty($_SERVER) && isset($_SERVER['REMOTE_ADDR']))
    { $REMOTE_ADDR = $_SERVER['REMOTE_ADDR']; }
    else if (!empty($_ENV) && isset($_ENV['REMOTE_ADDR']))
     { $REMOTE_ADDR = $_ENV['REMOTE_ADDR'];    }
    else if (@getenv('REMOTE_ADDR'))
     { $REMOTE_ADDR = getenv('REMOTE_ADDR');   }
    } // end if
   if (empty($HTTP_X_FORWARDED_FOR))
    {
     if (!empty($_SERVER) && isset($_SERVER['HTTP_X_FORWARDED_FOR']))
      { $HTTP_X_FORWARDED_FOR = $_SERVER['HTTP_X_FORWARDED_FOR']; }
      else if (!empty($_ENV) && isset($_ENV['HTTP_X_FORWARDED_FOR']))
       { $HTTP_X_FORWARDED_FOR = $_ENV['HTTP_X_FORWARDED_FOR']; }
      else if (@getenv('HTTP_X_FORWARDED_FOR'))
       { $HTTP_X_FORWARDED_FOR = getenv('HTTP_X_FORWARDED_FOR');}
    } // end if
   if (empty($HTTP_X_FORWARDED))
    {
     if (!empty($_SERVER) && isset($_SERVER['HTTP_X_FORWARDED']))
      { $HTTP_X_FORWARDED = $_SERVER['HTTP_X_FORWARDED']; }
      else if (!empty($_ENV) && isset($_ENV['HTTP_X_FORWARDED']))
      { $HTTP_X_FORWARDED = $_ENV['HTTP_X_FORWARDED']; }
      else if (@getenv('HTTP_X_FORWARDED'))
      { $HTTP_X_FORWARDED = getenv('HTTP_X_FORWARDED'); }
    } // end if
   if (empty($HTTP_FORWARDED_FOR))
    {
     if (!empty($_SERVER) && isset($_SERVER['HTTP_FORWARDED_FOR']))
      { $HTTP_FORWARDED_FOR = $_SERVER['HTTP_FORWARDED_FOR']; }
      else if (!empty($_ENV) && isset($_ENV['HTTP_FORWARDED_FOR']))
      { $HTTP_FORWARDED_FOR = $_ENV['HTTP_FORWARDED_FOR']; }
      else if (@getenv('HTTP_FORWARDED_FOR'))
      { $HTTP_FORWARDED_FOR = getenv('HTTP_FORWARDED_FOR'); }
    } // end if
   if (empty($HTTP_FORWARDED))
    {
     if (!empty($_SERVER) && isset($_SERVER['HTTP_FORWARDED']))
      { $HTTP_FORWARDED = $_SERVER['HTTP_FORWARDED']; }
      else if (!empty($_ENV) && isset($_ENV['HTTP_FORWARDED']))
       { $HTTP_FORWARDED = $_ENV['HTTP_FORWARDED']; }
      else if (@getenv('HTTP_FORWARDED'))
       { $HTTP_FORWARDED = getenv('HTTP_FORWARDED'); }
    } // end if
   if (empty($HTTP_VIA))
    {
     if (!empty($_SERVER) && isset($_SERVER['HTTP_VIA']))
      { $HTTP_VIA = $_SERVER['HTTP_VIA']; }
      else if (!empty($_ENV) && isset($_ENV['HTTP_VIA']))
       { $HTTP_VIA = $_ENV['HTTP_VIA']; }
      else if (@getenv('HTTP_VIA'))
       { $HTTP_VIA = getenv('HTTP_VIA'); }
    } // end if
   if (empty($HTTP_X_COMING_FROM))
    {
     if (!empty($_SERVER) && isset($_SERVER['HTTP_X_COMING_FROM']))
       { $HTTP_X_COMING_FROM = $_SERVER['HTTP_X_COMING_FROM']; }
      else if (!empty($_ENV) && isset($_ENV['HTTP_X_COMING_FROM']))
       { $HTTP_X_COMING_FROM = $_ENV['HTTP_X_COMING_FROM']; }
      else if (@getenv('HTTP_X_COMING_FROM'))
      { $HTTP_X_COMING_FROM = getenv('HTTP_X_COMING_FROM'); }
    } // end if
   if (empty($HTTP_COMING_FROM))
    {
     if (!empty($_SERVER) && isset($_SERVER['HTTP_COMING_FROM']))
      { $HTTP_COMING_FROM = $_SERVER['HTTP_COMING_FROM']; }
      else if (!empty($_ENV) && isset($_ENV['HTTP_COMING_FROM']))
       { $HTTP_COMING_FROM = $_ENV['HTTP_COMING_FROM']; }
      else if (@getenv('HTTP_COMING_FROM'))
      { $HTTP_COMING_FROM = getenv('HTTP_COMING_FROM'); }
    } // end if
   // Gets the default ip sent by the user
   if (!empty($REMOTE_ADDR)) { $direct_ip = $REMOTE_ADDR; }
   // Gets the proxy ip sent by the user
   $proxy_ip   = '';
   if (!empty($HTTP_X_FORWARDED_FOR))
     { $proxy_ip = $HTTP_X_FORWARDED_FOR; }
    else if (!empty($HTTP_X_FORWARDED))
     { $proxy_ip = $HTTP_X_FORWARDED;     }
    else if (!empty($HTTP_FORWARDED_FOR))
     { $proxy_ip = $HTTP_FORWARDED_FOR;   }
    else if (!empty($HTTP_FORWARDED))
     { $proxy_ip = $HTTP_FORWARDED;       }
    else if (!empty($HTTP_VIA))
     { $proxy_ip = $HTTP_VIA;             }
    else if (!empty($HTTP_X_COMING_FROM))
     { $proxy_ip = $HTTP_X_COMING_FROM;   }
    else if (!empty($HTTP_COMING_FROM))
     { $proxy_ip = $HTTP_COMING_FROM;     }
   // end if... else if...
   // Returns the true IP if it has been found, else FALSE
   if (empty($proxy_ip)) { return $direct_ip; /* True IP without proxy */ }
   else
   {
   $is_ip = preg_match('|^([0-9]{1,3}\.){3,3}[0-9]{1,3}|', $proxy_ip, $regs);
   if ($is_ip && (count($regs) > 0))
    {
     // True IP behind a proxy
     return $regs[0];
    }
    else
    {
     // Can't define IP: there is a proxy but we don't have
     // information about the true IP
     return FALSE;
    }
   } // end if... else...
} // end of the 'PMA_getIp()' function

echo PMA_getIp();
?>

В начало страницы
Hosted by uCoz