2

私の最近の課題は、ソケット プログラミングを使用して C でプロキシを作成することです。プロキシは、HTTP/1.0 を使用して構築する必要があるだけです。数時間の作業の後、Chromium で使用できるプロキシを作成しました。google やいくつかの .edu Web サイトなど、さまざまな Web サイトを読み込むことができます。ただし、多くの Web サイトでは、ページが見つからないという 404 エラーが返されます (これらのリンクは、プロキシを経由しない場合は正常に機能します)。これらの 404 エラーは、サイトのルート アドレス "/" でも発生します... これは意味がありません。

これは私の HTTP リクエストの問題でしょうか? ブラウザーから送信された HTTP 要求は、HTTP 要求メソッド、ホスト名、およびポートについて解析されます。たとえば、ブラウザーから GET 要求が解析されると、指定されたホスト名とポートへの TCP 接続が確立され、HTTP GET 要求が次の形式で送信されます。

GET /path/name/item.html HTTP/1.0\r\n\r\n

この形式は少数の Web サイトで機能しますが、残りの Web サイトでは 404 エラー メッセージが作成されます。これが問題でしょうか?そうでない場合、他に何がこの問題を引き起こしている可能性がありますか?

どんな助けでも大歓迎です。

4

1 に答える 1

7

考えられる説明の 1 つは、あなたが HTTP/1.0 プロキシを設計したという事実です。一方、共有ホスティング サイトの Web サイトは、最近では HTTP/1.1 でしか動作しません (完全ではありませんが、すぐに説明します)。 )。

考えられる問題はこれだけではありませんが、さらにアイデアを得るには、このように失敗している Web サイトの例を挙げる必要があります。

HTTP の基本を理解しているようです。クライアントがサーバーに TCP 接続を確立し、それを介して HTTP 要求を送信します。これは、要求行 (などGET /path/name/item.html HTTP/1.0) と、すべて CRLF で区切られた一連のオプションのヘッダー行で構成されます。 (つまり\r\n)。全体のロットは、2 つの連続する CRLF シーケンスで終了します。この時点で、反対側のサーバーは要求とリソースを照合し、適切な応答を返します。リソースはすべて、パス (例: /path/name/item.html) によって識別されます。これは、実際のファイルである場合もあれば、動的ページである場合もあります。

HTTP の大部分は、最初に発明されて以来、ほとんど変わっていません。ただし、クライアントが接続先のサーバーを見つける方法について考えてみてください。与えるのは、次のような URL です。

http://www.example.com/path/name/item.html

このことから、 であるスキームを調べhttpて、HTTP 接続を確立していることを認識します。次の部分はホスト名です。元の HTTP では、各ホスト名が独自の IP アドレスに解決され、クライアントがその IP アドレスに接続して要求を行うと想定されていました。当時、各サーバーには 1 つの Web サイトしかなかったので、これは問題なく機能しました。

しかし、Web サイトの数が増えるにつれて、すべての Web サイトに異なる IP アドレスを割り当てることが難しくなりました。特に、多くの Web サイトは非常に単純で、同じ物理マシン上で簡単に共有できるためです。複数のドメインを同じ IP アドレスでポイントするのは簡単でしたが (DNS システムによりこれは非常に簡単になります)、サーバーが TCP リクエストを受信すると、その IP アドレスへのリクエストがあることを認識するだけで、どの Web サイトかはわかりません。返送します。Hostそのため、クライアントが要求しているホスト名を要求自体で示すことができるように、新しいヘッダーが追加されました。これは、1 つのサーバーが多数の Web サイトをホストできることを意味し、Web サーバーはHostヘッダーを使用して、応答でどの Web サイトを提供するかを伝えることができました。

最近では、これは非常に一般的です。Hostヘッダーを使用しないと、多くの Web サイトが要求しているサーバーを認識できなくなります。通常、彼らはリストからデフォルトの Web サイトを想定していますが、これにはあなたが求めているファイルが含まれていない可能性があります。. /_ Host_

技術的な詳細が必要な場合は、HTTP RFCHostでヘッダーの説明を見つけることができます。

また、Web サイトが単純に HTTP/1.0 を拒否する可能性もあります。これが非常に多くの Web サイトで発生したとしたら、少し驚かれることでしょうが、わかりません。それでも、Host最初にヘッダーを試してください。

一部の人々が信じていることとは反対に、HTTP/1.0 でヘッダーを使用することを止めるものは何もないと信じてHostいますが、それを好まないサーバーがまだいくつかあるかもしれません。完全な HTTP/1.1 をサポートするよりも少し簡単です。これには、チャンク エンコーディングやその他の複雑さを理解する必要がありますが、単純なサンプル コードの場合は、Hostヘッダーを追加して HTTP/1.1 と呼ぶだけで済む可能性があります (これはお勧めしません)。ただし、製品コードには十分です)。

とにかく、Hostヘッダーを追加して、次のようなリクエストを行うことができます。

GET /path/name/item.html HTTP/1.0\r\n
Host: www.example.com\r\n
\r\n

読みやすいように複数の行に分割しました。最後にまだ空白行があることがわかります。

これが問題の原因ではない場合でも、Hostヘッダーがないと機能しないサイトが確実に存在するため、最近ではヘッダーを使用することをお勧めします。それでも問題が解決しない場合は、うまくいかないサイトの例を教えていただければ、その理由を探ることができます。

私が言ったことで不明な点や詳細が必要な場合は、質問してください。

于 2013-01-15T17:23:19.420 に答える