2009-03-05 10 views
4

私は、すべての単一サーバーにGET要求を送信する必要なしに、潜在的に大きなURLリスト(> 1000000)の可用性をチェックする方法があるかどうかを判断しようとしています。URLの可用性について安全な前提はありますか?

http://www.example.comにアクセスできない場合(サーバーに接続できないか、ドメインのDNS要求が失敗した場合など)、または4XXまたは5XX応答を受け取った場合、そのドメインのすべてにアクセスできなくなります(例:http://www.example.com/some/path/to/a/resource/named/whatever.jpg)?最初の仮定を無効にするには、302の応答(whatever.jpgなど)で十分でしょうか?私はサブドメインが別のと考えられるべきであると想像してくださいhttp://subdomain.example.comhttp://www.example.comは同じIPにダイレクトできないでしょうか?

私が思いつくショートカットごとに、カウンタの例を考えることができるようです。私は弾丸を噛むだけで、すべてのURLにGETリクエストを送信する必要がありますか?

答えて

7

残念ながら、4xxまたは5xxまたは他のコードからは何も推論できません。

これらのコードは個々のページ用であり、サーバー用ではありません。 1つのページがダウンしていて、別のページがアップしているか、または1つが500のサーバー側エラーを持っていて、もう1つがそうでない可能性があります。

GETの代わりにHEADを使用してください。これはページのMIMEヘッダーを取得しますが、ページのコンテンツは取得しません。これにより、(ページをレンダリングする必要がないため)サーバー側の時間を節約できます(コンテンツをバッファーに入れて破棄する必要がないため)。

また、keep-aliveを使用して、同じサーバーからの応答を高速化することをお勧めします。多くのHTTPクライアントライブラリがこれを行います。

1

URLの可用性について唯一仮定する必要があるのは、「URLを取得すると失敗する」ことです。

親ドメインのリクエストが失敗した場合、サブドメインリクエストが失敗すると想定するのは安全ではありません。すなわち、あなたの2つの要求の間に、あなたのネットワーク接続が上がったり、下がったり、一般的に不正になる可能性があるからです。要求の間でドメインを変更することも可能です。

すべてのインターネット接続の問題を無視します。あなたは、常に変化し続けることができるライブウェブサイトを扱っています。今のところ真実は、ページ構造を変更したり、特定のページを表示する方法を変えたりすると5分で真実ではないかもしれません。あなたの最善の策は、getが失敗すると仮定することです。

これは極端な視点のように見えるかもしれません。しかし、これらのイベントになります。それらをどのように扱うかによって、プログラムの堅牢性が決まります。

0

サーバーへの接続が実際に失敗した場合、そのサーバー上のURLをチェックする理由はありません。それ以外の場合は、何も想定できません。

3

ホスト(たとえばwww.example.com)のDNSルックアップが、そのホストのすべてのURLを無効にするのに十分である必要があります。サブドメインや他のホストは別々にチェックする必要があります。

4xxコードでは、特定のページが利用できないと伝えるかもしれませんが、他のページについては推測できません。

5xxコードは実際には何も教えてくれません。たとえば、ページがそこにある可能性がありますが、サーバーは現時点ではビジー状態です。後でもう一度試してみるとうまくいくかもしれません。

1

まず、1つのページに基づいて何かが失敗したと仮定しないでください。私は、IISが静的コンテンツを提供し続けますが、動的コンテンツを提供することはできない多くのケースを見てきました。

各ホスト名を一意に扱う必要があります。サブドメインはexample.netとみなされず、example.comは同じIPを指します。あるいは、たとえ彼らが同じサイトであるような保証人がいなくても。 IISには、単一のIPアドレスを使用して複数のサイトを実行できるホストヘッダーがあります。

0

他の人が言っていることに加えて、GET要求の代わりにHEAD要求を使用します。それらは同じように機能しますが、レスポンスにはメッセージ本文が含まれていないため、すべての帯域幅を節約できます。

関連する問題