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/local/bin/perl
$host_name = &GetHostName($ENV{'REMOTE_ADDR'});
print "Content-type: text/html\n\n";
print "あなたのホスト名は、$host_name です。";
exit;
sub GetHostName {
my($ip_address) = @_;
my(@addr) = split(/\./, $ip_address);
my($packed_addr) = pack("C4", $addr[0], $addr[1], $addr[2], $addr[3]);
my($name, $aliases, $addrtype, $length, @addrs);
($name, $aliases, $addrtype, $length, @addrs) = gethostbyaddr($packed_addr, 2);
return $name;
}
|
さて、このスクリプトで実験してみましょう。
こちらをクリックしてください。