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さん、ありがとうございました。
[上に]
[前に]
[次に]