某些 Web 服务器在使用其 IP 地址访问时会返回不允许直接 IP 地址访问的错误。
我一直在想这是如何工作的。我的意思是,浏览器不是总是解析 IP 地址并连接到它吗?“直接 IP 地址访问”不是只是跳过了 DNS 吗?远程服务器如何知道您跳过了 DNS?
答案1
回答你的问题它怎么知道,这与您的浏览器向服务器发送的内容有关。
您说得对,系统总是将其解析为 IP 地址,但浏览器会在 HTTP 标头中发送您尝试访问的 URL。
这是我在网上找到的一个示例标题,经过修改后看起来就像您在 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 地址区分谁想要哪个页面,因为它们都有相同的 IP 地址 - 但它可以通过 HTTP 标头区分它们。
答案2
在 HTTP 1.1 协议中(之前的 HTTP 1.0 版本已经过时了很长一段时间,因此不太可能被任何最新版本的浏览器使用),host
引入了标头。对于HTTP 1.1 是浏览器必须发出的必需标头行。浏览器将域名包含在该行中,例如Host: example.com
。因此,Web 服务器知道浏览器想要从该行访问哪个网站。由于 Web 服务器可能支持数十个网站,因此该行对于确定请求的页面位于哪个网站上非常重要。假设浏览器想要访问 example.com 上某个网站的主页,它在连接到服务器时会向服务器发出以下行:
GET / HTTP/1.1
该行指定浏览器希望获取网站的根文档,即“/”。如果您想要访问/somedir/testpage.html
,GET /somedir/testpage.html
则位于“get”行中。该行后面将是以下行:
Host: example.com
因此,如果 Web 服务器支持网站 example.com、someothersite.com、yetanothersite.org 等,它知道应该返回 example.com 的主页。如果它没有收到该行,或者该行中没有列出域名Host
,它就不知道应该返回哪个网站的主页。因此,它可能会返回错误消息,或者返回服务器“默认”站点的主页。
你可以使用远程登录协议,例如telnet example.com 80
从 Linux shell 提示符或 Apple OS X终端窗口,连接到默认 HTTP 端口,端口 80 - 请参阅使用 PuTTY 测试对网站的访问了解在 Windows 系统上使用 PuTTY 执行此操作的步骤。
答案3
这是由于Host:
HTTP 标头所致。这对于在同一 IP 地址上托管多个网站非常有用。例如,http://www.k7dxs.net/和http://www.philipgrimes.com/都位于同一个 IP 地址上。但是,由于Host:
标头的原因,它们可以显示两个不同的站点。
对于 HTTPS,正如 @Toothbrush 指出的那样,他们使用 TLS 服务器名称指示,因为主机标头是加密请求的一部分,如果没有它,服务器就不知道要提供哪个证书。
有趣的实验:获取 Firefox 的篡改数据(我还没能找到 Chrome 的等效程序)并开始篡改。打开http://slipstation.com/并编辑Host:
请求中的标头为http://www.zombo.com/。您将会看到一个可能很熟悉的网站,在这里一切皆有可能。
答案4
可以将 Web 服务器配置为仅接受与特定域或子域的连接。它可以托管多个域。
使用直接 IP 地址时 Web 服务器执行的操作是可配置的。对于 Apache,它将默认转到已启用站点中第一个命名的虚拟主机,这些站点按字母数字顺序排序。
经过快速搜索,这是我找到的 Apache 文档中最相关的部分:
https://httpd.apache.org/docs/current/vhosts/name-based.html