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

さて、このスクリプトで実験してみましょう。こちらをクリックしてください。

IPアドレスの逆引き