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