HEADメソッド発行時ステータス・コードがうまく取得できません

[上に] [前に] [次に]
佐藤 1999/10/22(金) 16:34:19
初めて質問します、佐藤と申します。

自分のホームページで、小規模サーチエンジンをやっているのですが、たまに間違ったURLで登録する方が居ます。
そこで、CGIでフォームからURLを受け取った際に、SOCKETを通してHTTPのHEADメソッドを発行し、帰ってきたステータス・コードを確認する、という処理を考えています。

ところが、CGIで取得するとステータス・コードが「HTTP/1.1 404 Not found」となるのに、WWWブラウザからそのURLを閲覧するとちゃんと表示されるページがたまに有り、困っています。

よろしくお願いします。

以下がその処理を行うソースです。

#!/usr/bin/perl

$url = "http://www.xxx.com/zzz.html";

$url =~ /http\:\/\/([\w\.]+)(\/.+)/;
$host = $1;
$path = $2;

$addr = (gethostbyname($host))[4];
$name = pack("S n a4 x8", 2, 80, $addr);
socket(S, 2, 1, 0);
connect(S, $name);
select(S); $| = 1; select(stdout);
print S "HEAD $path HTTP/1.0\n\n";
$response = <S>;
close(S);

if ($response =~ /HTTP\/\d\.\d 200/) {
print "正常なURLです。";
} else {
print "異常なURLです。";
}

B-Cus 1999/10/22(金) 16:50:22
例えば
 http://www.ftnet.or.jp/FTtuusin/index.html
は見られる? これがダメなら、リクエストに Host: ヘッダを付けるべし。
いわゆるバーチャルドメインっつーやつだね。

佐藤 1999/10/25(月) 15:04:53
B-Cusさん、お答えいただきありがとうございます。

http://www.ftnet.or.jp/FTtuusin/index.htmlは最初は駄目だったのですが、「Host:」を付ける事で見えるようになりました。
自分の方でテストしていたURLのいくつかについても、「Host:」を付ける事によって解決したのですが、一つだけ見えないドメインが有ります。
http://member.nifty.ne.jp/
です。

このドメインも、WWWブラウザからだと問題なく見えるので、首を傾げています。

B-Cus 1999/10/25(月) 22:21:59
> 一つだけ見えないドメインが有ります。
> http://member.nifty.ne.jp/
うちからは見えています。「見えない」じゃなくて、どこがうまくいかないかを
書きましょう。gethostbyname でコケるとか、connect でコケるとか、
$response が 404 になってしまうとか。

> $url =~ /http\:\/\/([\w\.]+)(\/.+)/;
$url =~ /http\:\/\/([\w\.]+)(.*)/;
> $host = $1;
> $path = $2;
$path = $2 || "/";

とかじゃなくて?

佐藤 1999/10/26(火) 10:51:57
おかしいのは、$responseのステータス・コードが「404」になってしまう点です。

正規表現と$pathの部分を直した上でのソースと、出力結果を下に載せますので、よろしくお願いします。

●ソース
#!/usr/bin/perl

$url = "http://member.nifty.ne.jp/";

$url =~ /http\:\/\/([\w\.]+)(.*)/;
$host = $1;
$path = $2 || "/";

$addr = (gethostbyname($host))[4];
$name = pack("S n a4 x8", 2, 80, $addr);
socket(S, 2, 1, 0);
connect(S, $name);
select(S); $| = 1; select(stdout);
print S "HEAD $path HTTP/1.0\n";
print S "Host: $host\n";
print S "\n";
@response = <S>;
close(S);

if ($response[0] =~ /^HTTP\/\d\.\d 200/) {
print "$urlは正常なURLです。";
} else {
print "$urlは異常なURLです。";
}

print "\n\n";

print @response;

●実行結果
http://member.nifty.ne.jp/は異常なURLです。

HTTP/1.1 404 Not found
Server: Netscape-Enterprise/3.6 SP2
Date: Tue, 26 Oct 1999 01:45:55 GMT
Content-type: text/html
Connection: close

B-Cus 1999/10/26(火) 13:10:20
この web サーバ (Netscape-Enterprise/3.6 SP2)、すげー変な挙動するなぁ。
 ・GET なら OK
 ・HEAD でも、ファイルを直接指定したら OK
 ・HEAD で、ディレクトリを指定したら 404
のようで。
 http://member.nifty.ne.jp/
 http://member.nifty.ne.jp/index.htm
あたりを調べた結果です。

佐藤 1999/10/26(火) 14:03:38
[[解決]]
最終的に、GETメソッドでデータを取得し、一行目のステータス・コードだけ調べる、という方法にする事にしました。
おかげで、こちらでテストしていたURLについては、全て解決いたしました。

B-Cusさん、ありがとうございました。

[上に] [前に] [次に]