一部のWebサーバーは、IPアドレスを使用してアクセスすると、直接IPアドレスアクセスが許可されていないというエラーを返します。
私はこれがどのように機能するのかしばらく疑問に思っていました。つまり、ブラウザは常にIPアドレスを解決してそれに接続するとは限りませんか?「直接IPアドレスアクセス」はDNSをスキップするだけではありませんか?リモートサーバーは、DNSをスキップしたことをどのように認識しますか?
一部のWebサーバーは、IPアドレスを使用してアクセスすると、直接IPアドレスアクセスが許可されていないというエラーを返します。
私はこれがどのように機能するのかしばらく疑問に思っていました。つまり、ブラウザは常にIPアドレスを解決してそれに接続するとは限りませんか?「直接IPアドレスアクセス」はDNSをスキップするだけではありませんか?リモートサーバーは、DNSをスキップしたことをどのように認識しますか?
回答:
それがどのようにわかっているかというあなたの質問に答えるには、あなたのブラウザがサーバーに送るものと関係があります。
システムは常にそれを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ヘッダーで区別できます。
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.html
、GET /somedir/testpage.html
「取得」の行になります。行の後には次の行が続きます。
Host: example.com
そのため、Webサーバーがexample.com、someothersite.com、yetanothersite.orgなどのWebサイトをサポートしている場合、example.comのメインページを返す必要があることがわかります。その行を取得できない場合、またはその行にドメイン名がリストされHost
ていない場合、どのWebサイトのホームページが返されるべきかはわかりません。そのため、代わりにエラーメッセージを返すか、サーバーの「デフォルト」サイトのホームページを返す場合があります。
LinuxシェルプロンプトやApple OS X ターミナルウィンドウなど、telnetプロトコルを使用してブラウザーが発行する同じコマンドを発行して、デフォルトのHTTPポートであるポート80に接続できます - 手順については、PuTTYを使用したWebサイトへのアクセスのテストを参照してくださいWindowsシステムでPuTTYを使用してこれを行うには。telnet example.com 80
これは、Host:
HTTPヘッダーが原因です。これは、同じIPアドレスで複数のサイトをホストする場合に非常に便利です。たとえば、http://www.k7dxs.net/とhttp://www.philipgrimes.com/は両方とも同じIPアドレスにあります。ただし、Host:
ヘッダーのため、2つの異なるサイトを表示できます。
HTTPSの場合、@ Toothbrushが指摘したように、ホストヘッダーは暗号化された要求の一部であり、サーバーはこれがないとどの証明書を提供するかわからないため、TLS Server Name Indicationを使用します。
楽しい実験:Firefoxの改ざんデータを取得し(Chromeに相当するものを見つけることができませんでした)、改ざんを開始します。http://slipstation.com/を開きHost:
、リクエストのヘッダーを編集してhttp://www.zombo.com/にします。なにかおなじみのウェブサイトが表示されます。
Webサーバーは、特定のドメインまたはサブドメインへの接続のみを受け入れるように構成できます。複数のドメインをホストしている可能性があります。
直接IPアドレスが使用されるときにWebサーバーが行うことは構成可能です。Apacheの場合、デフォルトでは、有効なサイトのうち最初に名前が付けられたvhostに移動します。これらのサイトは英数字順にソートされます。
これは、クイック検索の結果、私が見つけたApacheドキュメントの最も重要な部分です。
https://httpd.apache.org/docs/current/vhosts/name-based.html