На главную страницу
Функции и методы для работы с адресами и переменными НТТР• 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 или суперглобального массива $_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();
?>
|