Что
такое IP-адрес и для чего он нужен вебмастеру? IP-адрес
представляет собой уникальный 32-х битный идентификатор
компьютеров, состоящий из четырех десятичных чисел,
разделенных точками, например, 127.0.0.2. Взаимодействие или
обращение к определенному компьютеру в Интернете
осуществляется по его IP-адресу. В идеале каждый компьютер, с
которого пользователь запрашивает страницы сайта, имеет
постоянный уникальный IP-адрес, который, в свою очередь,
передается серверу при запросах. На практике это не всегда
так. Иногда нельзя отличить разных пользователей, работающих
через один прокси-сервер по IP-адресам, т.к. в HTTP заголовках
передается IP-адрес прокси-сервера, а не конкретного
пользователя.
Отслеживание IP-адресов посетителей
страницы или сайта позволяет определять новых и старых
пользователей, т.е. повторные и новые визиты. В свою очередь
эта информация может быть использована для решения различных
практических задач, таких как, например, создание счетчиков
посещения сайта, ограничение повторного участия в голосовании
и т.п. Таким образом, определение IP-адреса является задачей,
решение которой открывает массу полезных возможностей для
вебмастера.
Переменные окружения CGI и доступ к ним в
Perl При запросе пользователем веб-страницы с сервера
браузер посылает ему запрос по протоколу HTTP. Запрос браузера
в соответствии с протоколом всегда содержит заголовок. В
заголовке содержится имя запрашиваемого файла, путь к нему,
версия протокола HTTP и, что наиболее интересно для нас,
информация о пользователе, включая IP-адрес. В сценарии,
написанном на языке Perl, эта информация доступна через
ассоциативный массив (хеш) %ENV. Некоторые переменные
окружения, используемые для идентификации пользователя, и их
значения представлены в таблице 1.
Таблица 1 - Имена и
значения некоторых переменных окружения, используемых для
идентификации пользователя
Имя переменной окружения
Значение переменной HTTP_COOKIE Записанные в браузере
cookie для данного URL HTTP_X_FORWARDED_FOR IP-адрес
клиента при подключении через прокси REMOTE_ADDR Удаленный
IP-адрес клиента REMOTE_HOST Имя удаленного узла,
осуществляющего запрос
Для того, чтобы получить доступ
к значению переменной окружения с помощью Perl необходимо
просто использовать в качестве ключа в хеше %ENV имя этой
переменной. Например, удаленный IP-адрес клиента можно
получить, используя в хеше имя REMOTE_ADDR и ,соответственно,
запись $ENV{ REMOTE_ADDR }.
Значения всех переменных
окружения, доступных через хеш %ENV, можно получить,
воспользовавшись простым скриптом:
#!/usr/local/bin/perl ## если perl в другом
каталоге - #!/usr/bin/perl print "Content-type:
text/html\n\n"; ## перебираем все ключи хеша и для каждого
## выводим запись "ключ" - "значение" foreach $key(
keys( %ENV ) ) { print "$key - $ENV{ $key }\n";
}
Запись IP-адреса в скалярную
переменную Последняя тонкость, которую нужно знать для
определения IP-адреса на Perl, состоит в том, что при
подключении пользователя через прокси-сервер, в переменной
$ENV{ REMOTE_ADDR } будет храниться его IP-адрес, а не
IP-адрес пользователя. Как указано в таблице 1, IP-адрес
клиента при подключении через прокси находится в переменной
$ENV{ HTTP_X_FORWARDED_FOR }. Теперь мы уже знаем все
необходимое для определения IP-адреса на Perl. Все что
осталось -- это написать соответствующий код:
## если
ключ HTTP_X_FORWARDED_FOR определен if ( $ENV{
HTTP_X_FORWARDED_FOR } ) { ## в переменную $ip
записывается IP-адрес ## клиента, подключенного через
прокси $ip = $ENV{ HTTP_X_FORWARDED_FOR}; } else {
## в противном случае запишем в $ip ## удаленный
IP-адрес клиента $ip = $ENV{ REMOTE_ADDR };
}
Согласно этому программному коду в переменную $ip
записывается IP-адрес клиента при подключении через прокси или
удаленный IP-адрес, если подключение идет не через прокси.
Пример использования IP-адреса для учета повторных
визитов Ниже приведен программный код cgi скрипта на языке
Perl, осуществляющий проверку повторных визитов. В том случае,
если осуществлен первый визит будет выдано приветствие "Вы
здесь впервые!", а если визит повторный -- "Вы здесь уже
были!". IP-адреса машин, с которых уже осуществлялись визиты,
записываются в файл ip_base на сервере.
#!/usr/local/bin/perl ## записываем IP-адрес в
переменную $ip if ( $ENV{ HTTP_X_FORWARDED_FOR } ) {
$ip = $ENV{ HTTP_X_FORWARDED_FOR }; } else { $ip =
$ENV{ REMOTE_ADDR }; } $path_to_file = "ip_base";
$comment = "Вы здесь в первый раз!" ## открываем файл
ip_base и ищем в нем ## IP-адрес из переменной $ip
open ( IP_BASE, "$path_to_file" ); while (
>IP_BASE< ) { if ( /$ip/ ) { $comment = "Вы
здесь уже были!"; } } close ( IP_BASE ); ##
записываем в файл ip_base новый IP-адрес ## если
пользователь здесь впервые if ( $comment eq "Вы здесь в
первый раз!" ) { open ( ADD_IP, "<<$file" );
print ADD_IP "$ip\n"; close ( ADD_IP ); } ##
Выводим html файл с комментарием print "Content-type:
text/html\n\n"; print
">h1<$comment>/h1<";
|