- 締切済み
別サーバーのリンク先が存在しない場合リンクしない
前回は下記のURLにて http://oshiete1.goo.ne.jp/qa2542908.html 同一サーバーの場合アジャックスを使用すると出来るということは教えていただいたのですが、「別サーバーへのリンク先が存在しない時はリンクしない」といった場合はどうすればいいのでしょうか? また、リンクは複数あるのでまとめて指定できるようにしたいです。 宜しくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- umasikajiro
- ベストアンサー率67% (545/803)
#! /usr/bin/perl use CGI::Carp qw(fatalsToBrowser); print"Content-type: text/html\n\n"; print"<html><body>\n"; print"<h1> TEST </h1>\n"; open (U,"url.txt"); while($Url=<U>) {if($Url =~m|http://([^/]*)(/.*)|) {$Srv = $1; $Uri = $2; $Ghb = (gethostbyname($Srv))[4]; $Con = pack("S n a4 x8", 2, 80, $Ghb); socket(S, 2, 1, 0); connect(S, $Con); binmode(S); select(S); $| = 1; select(stdout); # ここから空行までがリクエストヘッダ print S "HEAD $Uri HTTP/1.1\r\n";# リクエストヘッダの改行は\r\nである print S "Host: $Srv\r\n"; print S "Connection: Keep-Alive\r\n"; print S "\r\n";# ヘッダの終端なので空行も出力 while(<S>) { if(m|HTTP/\d\.\d\s+([\d]+)\s.*|) { print "Status=[ $_ ] ";# TEST用、不要ならコメント化 if($1 == 200){print "<A href=\"$Url\">$Url</a> <BR>\n";} # ↑ステータスコードが200の場合のみリンク表示 else{print "$Url <BR>\n";} # ↑ 200以外はURLをテキスト表示(不要ならコメントアウト) last; } } } } close(U); __END__ ステータスコードが200(正常なアクセス)のときのみリンク表示します。 Statusコードについては http://www.studyinghttp.net/status_code 転送、サーバーエラー, Not Foundなどの場合は200以外のコードを返します。 もしコード200のままで、エラーメッセージを表示するようにしていると ヘッダだけではなく本文をチェックして分岐処理しなくてはいけません。 >http://www.xxx/xxxxooo oの部分のみ異なる場合はどうすれば良いのでしょうか? 同じサーバー内に複数のページがあるのでしたら 上のようにリクエストヘッダの中にConnection: Keep-Aliveを含めれば 効率的にアクセスできます。 その上で普通に http://www.xxx/xxxxoo1 http://www.xxx/xxxxoo2 http://www.xxx/xxxxoo3 と列記すればよいと思います。
- umasikajiro
- ベストアンサー率67% (545/803)
まずURLのリストを別fileに列記(仮にfile名をurl.txtとします) CGIをperlで書くなら例として #! /usr/bin/perl use CGI::Carp qw(fatalsToBrowser); #この行はデバッグ用( 正常動作を確認したらコメントアウトする) print"Content-type: text/html; charset=shift_jis\n\n"; print"<html><body>\n"; print"<h1> TEST </h1>\n\n"; use LWP::Simple; open (U,"url.txt"); while(<U>) { if(head($_)){print "<A HREF=\"$_\">$_</a><BR>\n"} } close(U); __END__ こんなので出来ますが、 例えばFORMでURLを入力してもらって自動リンクなどにする場合、 実用に供するには、URLの書式チェック&セキュリティチェックが必須です。
補足
ご回答ありがとうございます!! 教えていただいたcgiで出来ました!! ただ、存在しない場合は動作するのですが今回アクセスするページがデータベースでして、そのデータベース上にデータが存在しない場合はNot Foundではなく「専用のエラーページにアクセスする」というプログラムがあるようです。 なので、このcgiでは「リンク先は存在する」と判断されてしまいリンクが表示されてしまうのです。 「http://www.xxx/xxxx.htmlの場合はリンクしない」といった場合はどうすれば良いのでしょうか? なお、リンクは複数あってそれぞれ下3桁のみ http://www.xxx/xxxxooo oの部分のみ異なる場合はどうすれば良いのでしょうか? リンクの数が多いので、できればphpとcgiの連携でくみたいのですが・・・ お手数ですがご教授宜しくお願いします。