Articles

HOME > Articles > [Technical] How to validate the URL
 [Search]  [Site Map]

PerlでURLの正しさを検証する方法

ゲストブックなどで、来訪者のWebサイトのURLを入力してもらったり、各種WebアプリケーションなどでURLを受け取って、それによって処理をする場合など、手で入力されたURLを扱う機会は多々あります。しかし、そのURLが指し示すリソースが本当にネットワーク上に存在するかどうかを確かめるのはなかなか大変な作業だと思われがちです。ここでは、Perlプログラムでそれを実現する方法をご紹介しましょう。

前提知識

URLが正しいかどうかは、指定されたURLが指し示すリソースに対して実際にアクセスしてみて、確かめるしかありません。

具体的には、サーバのポート80に接続し、HEADリクエストを発行します。例えば、http://www.motchie.com/index.htmlの場合は、www.motchie.comのポート80番に接続し、以下のようなリクエストを発行します:

HEAD /index.html HTTP/1.0

注) このリクエストは、実際には失敗します。また、最後に空行が含まれていることに注意して下さい。

リクエストが成功し、URLで指し示されたファイルが存在する場合には、サーバは以下のようなヘッダを返します:

HTTP/1.1 200 OK
...

このステータスコード200が返されたら、そのリソースは存在することになります。HTTPステータスコードの詳細については、RFC2616を参考にして下さい。

実現する方法

このサンプルでは、libwww-perlを用いています。最近のPerl配布キットには標準で添付されているそうです。また、ActiveState Tool社ActivePerlにも含まれています。

  1. まず、以下のようなリンクチェック用のモジュールを作成しましょう。これをLink.pmという名前で保存して下さい。
    package Link;
    
    use strict;
    use Carp;
    use LWP::UserAgent;
    use HTTP::Request;
    use HTTP::Response;
    
    sub check {
    
      my $chkurl = shift;
    
      my $ua = new LWP::UserAgent;
    
      my $req = new HTTP::Request( 'HEAD', $chkurl );
      my $res = $ua -> request( $req );
    
      return ( $res -> is_success ) ? 1 : 0;
    
    }
    
    1;
    

    このcheck関数は一つだけ引数を取り、それはチェックしたいURLです。check関数はURLが指し示すリソースに対してHEADリクエストを発行し、リクエストが成功したらtrueを、失敗すればfalseを返します。

  2. 次に、このモジュールを利用するメインプログラムを作成してみましょう。
    use Link;
    
    $url = 'http://www.motchie.com/';
    
    print ( Link::check ( $url ) ? "yes" : "no");
    

    このプログラムは先ほど作成したLinkモジュールを利用してURLが指し示すリソースがネットワーク上に存在するかどうかを確かめ、存在すればyesと表示し、存在しなければnoと表示します。

このページの内容は、完全に無保証です。全ての環境において、この記事の内容が正しいことを保証するものでもありません。また、この記事の内容について、みなさまがどのような損害/不利益を被られても、私はそれらに対して何らの賠償などを行うものでもありません。しかし、これらの記事についての訂正、質問、苦情、その他ご意見は歓迎いたします。それらに対しては、ぼくのできる範囲で対応させていただきたいと思います。

 [GO! Sophisticated Page!]  [valid html 4.01!]  [Valid CSS!]