アクセス元を取得する
ウェブサイトの訪問者がどこからアクセスしてきたかという情報(アクセス元情報)を取得し、表示を切り替える Perl/CGIプログラムを作成 してみましょう。
訪問者がどこからアクセスしてきたかによりPerl/CGIプログラムの処理を切り替え、適切なメッセージを表示させることはユーザーアクセシビリティーという側面からみても大切なことです。
このウェブサイトでも、 Perl/CGIプログラムで使う文字を16進数に変換するソフトウェア などを公開しています。
このようなソフトウェアをウェブ上に公開していると、外部サイトからPerl/CGIプログラム(公開しているソフトウェア)に直接リンクされることがあります。
気に入っていただけたのであれば、まぁそれでもよいという考え方もありますが…。
だったら、一緒に公開しているウェブページにもリンクを張ってもらいたいものですよね。
ということで、訪問者のアクセス元(どのウェブページのリンクから来たか)を取得し、その後の処理を切り替える Perl/CGIプログラムを作成 してみましょう。
アクセス元の情報を取得
アクセス元(リンク元)のURLを取得し表示するPerl/CGIプログラムを作成してみましょう。
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print $ENV{'HTTP_REFERER'};
exit;
Perl/CGIプログラムサンプル はこちらに設置してあります。
このPerl/CGIプログラムにアクセスすると、アクセス元(リンク元)のURLを表示します。
なので、上記リンクよりPerl/CGIプログラムサンプルにアクセスした場合は、このウェブページのURLが表示されます。
Perl/CGIプログラムでアクセス元(リンク元)のURLを取得するには、 環境変数 「$ENV{'HTTP_REFERER'}」を参照します。
アクセス元により処理を切り替える
アクセス元(リンク元)により、その後の処理を切り替えるPerl/CGIプログラムを作成してみましょう。
#!/usr/bin/perl
use strict;
if (&RefererCheck) {
print "Content-type: text/html\n\n";
print "OK";
} else {
print "Location: http://kimurashuuichi.com\n\n";
}
exit;
sub RefererCheck {
my $referer = $ENV{'HTTP_REFERER'};
unless ($referer) {return;}
unless ($referer =~ m|^https?://(www\.)?kimurashuuichi\.com|) {return;}
return 1;
}
__END__
Perl/CGIプログラムサンプル はこちらに設置してあります。
このPerl/CGIプログラムは、このウェブサイトのドメイン(kimurashuuichi.com)からアクセスされた場合にのみ「OK」を表示します。
もし、アクセス元(リンク元)の情報を取得できなかった場合や、外部サイトからアクセスされた場合には、このウェブサイトのトップページにジャンプ(リダイレクト)します。
Perl/CGIプログラム解説
このPerl/CGIプログラムサンプルについて説明します。
メイン処理
メイン処理では、RefererCheck関数から返された値を if文で判定 し処理を切り替えています。
サブルーチン RefererCheckは、アクセス元(リンク元)の情報を取得し、自サイトからのリンクであれば1を返し、それ以外では戻り値を返さない関数です。
if文が成立した場合は「OK」を表示させています。
それ以外の場合には、このサイトのトップページに転送(リダイレクト)させています。
訪問者のウェブブラウザをこちらの指定したURLに転送(リダイレクト)させるには、「print "Location: http://kimurashuuichi.com\n\n";」のようにします。
print関数で、「Location:」の後に、転送したいURLを指定し改行「\n」を2回入れます。
このほかにも、 CGIモジュールを使ってURL転送(リダイレクト)させる こともできます。
RefererCheck関数
RefererCheck関数は、環境変数「$ENV{'HTTP_REFERER'}」を参照し、指定したドメインが含まれていれば1を返し、それ以外では何も値を返さない関数です。
このPerl/CGIプログラムサンプルでは、kimurashuuichi.comドメインを含んでいるかどうかを パターンマッチ で調べています。