REMOTE_HOST・REMOTE_ADDR

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;
}

さて、このスクリプトで実験してみましょう。