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
my $host_name = &GetHostByAddr( $ENV{'REMOTE_ADDR'} );
print "Content-type: text/plain; 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;
}
さて、このスクリプトで実験してみましょう。