web-dev-qa-db-ja.com

Webサーバーは、直接IPアドレスアクセスを使用しているかどうかをどのようにして知るのですか?

一部のWebサーバーは、IPアドレスを使用してアクセスすると、IPアドレスへの直接アクセスが許可されていないというエラーを返します。

私はこれがどのように機能するのかしばらく考えていました。つまり、ブラウザは常にIPアドレスを解決して接続しないのですか? 「直接IPアドレスアクセス」はDNSをスキップするだけではありませんか?リモートサーバーはどのようにして知っている DNSをスキップしましたか?

65
Joseph A.

知っている方法の質問に答えるには、ブラウザがサーバーに送信するものと関係があります。

システムは常にそれをIPアドレスに解決しますが、ブラウザーはアクセスしようとしたURLをHTTPヘッダーで送信します。

これは私がオンラインで見つけたサンプルヘッダーで、WindowsでFirefoxを使用してアドレスバーにApple.comと入力したかのように変更されています。

GET / HTTP/1.1
Host: Apple.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

IPアドレスを使用した場合のヘッダーは次のようになります。

GET / HTTP/1.1
Host: 17.142.160.59
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

これらはどちらもソケットを介して同じIPアドレスに送信されますが、ブラウザはサーバーがアクセスしたことをサーバーに通知します。

どうして?同じIPアドレスを持つWebサーバーは複数のサイトをホストし、それぞれに異なるページを提供する可能性があるためです。誰もが同じページを持っているため、誰がどのページを望むかをIPアドレスで区別することはできませんが、HTTPヘッダーでそれらを区別することはできます。

91
iAdjunct

HTTP 1.1プロトコル(以前のHTTP 1.0バージョンはかなり以前から廃止されているため、最近のバージョンのブラウザーで使用される可能性は低い)で、Hostヘッダーが導入されました。 ブラウザが発行する必要のある必須ヘッダー行であるHTTP 1.1 の場合。ドメイン名はブラウザによってその行に含まれています。 Host: example.com。したがって、Webサーバーは、ブラウザがその行からアクセスしたいWebサイトを認識しています。 Webサーバーは数十のWebサイトをサポートしている可能性があるため、要求されたページがどのWebサイトにあるかを判別するには、その行が重要です。ブラウザがexample.com上のサイトのホームページにアクセスしたいとすると、サーバーに接続するときにサーバーに次の行を発行します。

GET / HTTP/1.1

その行は、ブラウザがルートドキュメント、つまりWebサイトの「/」を取得したいことを指定しています。アクセスしたい場合/somedir/testpage.htmlGET /somedir/testpage.htmlは「get」行にあります。この行の後には次の行が続きます。

Host: example.com

したがって、Webサーバーがウェブサイトexample.com、someothersite.com、yetanothersite.orgなどをサポートしている場合、example.comのメインページを返す必要があることがわかります。その行を取得できない場合、またはHost行にドメイン名がリストされていない場合、どのWebサイトのホームページを返すかがわかりません。そのため、代わりにエラーメッセージを返すか、サーバーの「デフォルト」サイトのホームページを返す場合があります。

telnet プロトコルを使用して、ブラウザが発行するのと同じコマンドを発行できます(例:telnet example.com 80 LinuxシェルプロンプトまたはApple OS X Terminal ウィンドウから)。デフォルトのHTTPポートであるポート80に接続します-参照 WindowsシステムでPuTTYを使用して実行する手順については、PuTTYを使用するWebサイト

21
moonpoint

これは、Host: HTTPヘッダーが原因です。これは、同じIPアドレスで複数のサイトをホストする場合に非常に役立ちます。たとえば、 http://www.k7dxs.net/http://www.philipgrimes.com/ は両方とも同じIPアドレス上にあります。ただし、Host:ヘッダーがあるため、2つの異なるサイトを表示できます。

HTTPSの場合、@ Toothbrushが指摘したように、ホストヘッダーは暗号化された要求の一部であり、サーバーはこれなしで提供する証明書を認識しないため、TLSサーバー名表示を使用します。

楽しい実験:Firefoxの改ざんデータを入手し(Chromeに相当するものを見つけることができませんでした)、改ざんを開始します。 http://slipstation.com/ を開き、リクエストのHost:ヘッダーを編集して http://www.zombo.com/ にします。何でも可能である、おなじみのWebサイトが表示されます。

6

Webサーバーは、特定のドメインまたはサブドメインへの接続のみを受け入れるように構成できます。複数のドメインをホストしている可能性があります。

直接IPアドレスが使用されている場合のWebサーバーの動作は設定可能です。 Apacheの場合、デフォルトでは有効なサイトのうち最初に指定されたvhostに移動します。これらのサイトは英数字順にソートされています。

これは、簡単な検索の結果、私が見つけたApacheドキュメントの最も関連性の高い部分です。

https://httpd.Apache.org/docs/current/vhosts/name-based.html

5
paradroid