Web 服务器如何知道您是否使用直接 IP 地址访问?

Web 服务器如何知道您是否使用直接 IP 地址访问?

某些 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.htmlGET /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

相关内容