考えられる説明の 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
ヘッダーがないと機能しないサイトが確実に存在するため、最近ではヘッダーを使用することをお勧めします。それでも問題が解決しない場合は、うまくいかないサイトの例を教えていただければ、その理由を探ることができます。
私が言ったことで不明な点や詳細が必要な場合は、質問してください。