REMOTE_ADDRは、アクセス元のIPアドレスを表します。つまりあなたのホームページやCGIに対してアクセスした人がつかんでいるIPアドレスです。それに対してREMOTE_HOSTは、REMOTE_ADDRで取得したIPアドレスをDNSで逆引きしたホスト名をあらわします。
しかし、サーバによっては、REMOTE_HOSTを返さないものもあります。これはサーバの負荷を軽減するためです。サーバはアクセスがあるたびに、IPアドレスに対してDNSの逆引きをしなければなりません。したがって、サーバ管理者によっては、これを実施しないように設定するのです。この場合、REMOTE_HOSTの情報をどのように取ればよいのでしょうか。
Perlスクリプトで、REMOTE_ADDRから取得したIPアドレスから逆引きするようにすればよいのです。「gethostbyaddr」関数を使って、ホスト名を取得します。
以下に例を記します。この例では、CGIにアクセスすると、環境変数からアクセス元のIPアドレスを取得し、gethostbyaddr関数を使って、ホスト名を取得し、出力します。
#!/usr/bin/perl
use strict;
my $host_name = &GetHostByAddr($ENV{'REMOTE_ADDR'});
print "Content-type: text/html; charset=utf-8\n\n";
print "あなたのホスト名は、$host_name です。";
exit;
sub GetHostByAddr {
my($ip) = @_;
my @addr = split(/\./, $ip);
my $packed_ip = pack("C4", $addr[0], $addr[1], $addr[2], $addr[3]);
my($name) = gethostbyaddr($packed_ip, 2);
return $name;
}
use strict;
my $host_name = &GetHostByAddr($ENV{'REMOTE_ADDR'});
print "Content-type: text/html; charset=utf-8\n\n";
print "あなたのホスト名は、$host_name です。";
exit;
sub GetHostByAddr {
my($ip) = @_;
my @addr = split(/\./, $ip);
my $packed_ip = pack("C4", $addr[0], $addr[1], $addr[2], $addr[3]);
my($name) = gethostbyaddr($packed_ip, 2);
return $name;
}
さて、このスクリプトで実験してみましょう。こちらをクリックしてください。