你能通过在地址栏中输入 IP 地址来访问网站吗?

你能通过在地址栏中输入 IP 地址来访问网站吗?

当我学习网络和 DNS 服务器以及其他知识时...我很好奇,您能通过在地址栏中输入 IP 地址来访问网站吗?

答案1

总结这取决于服务器的配置。一个简单的正面例子是一一一一/1.1.1.1

我假设您正在按照计算机网络课程的常规讲座了解如何访问网站,其中列出了以下步骤:

  1. www.example.com在浏览器地址栏中输入并按 Enter。
  2. 浏览器在 DNS 中查找www.example.com并检索其 IP 地址。
  3. 浏览器与其中一个已获知的 IP 地址建立 TCP 连接。由于您未指定端口,浏览器将使用 HTTP 协议的默认端口 (80)。
  4. 浏览器向服务器发送 HTTP 请求。
  5. 浏览器接收 HTTP 响应并显示网页。

上述过程中可能还有其他因素影响某些细节,但我们暂时先将其放在一边。


域名实际使用两次在这个过程中:一个用于 DNS 查找,另一个在步骤 3 中的 HTTP 请求中。HTTP 是少数将访问域名发送到服务器的协议之一。在上面的例子中,至少,这是浏览器发送到 IANA 服务器(托管www.example.com)的内容:

GET / HTTP/1.0
Host: www.example.com

如果你通过裸 IP 地址访问它(假设它是 192.0.2.1),你的浏览器将通过 TCP 流发送此信息:

GET / HTTP/1.0
Host: 192.0.2.1

最常见的 HTTP 服务器(Nginx、Apache、IIS 等)都有一个称为“虚拟服务器”的概念,即根据域名(HTTPHost标头)选择配置。答案就在这里:这取决于服务器。有些服务器可能会针对裸 IP 标头返回相同的站点Host,而有些则不会。所有服务器的行为都按照管理员的配置进行。

对于 Nginx,您可以将服务器 IP 添加到与域名server_name相同的块中的指令中,或者请求将被路由到默认块(带有 的块,如果没有,则为第一个块,其中包含 `default_server)。虽然我不熟悉 Apache 或 IIS,但它们肯定有类似的设置。serverserverdefault_server


有关可能影响示例流程的因素的更多详细信息:

  • 在浏览器执行 DNS 请求之前,它首先会规范化从地址栏收到的内容。因此实际网址后续步骤应该http://www.example.com/方案前面加上 ( http://) 并附加最小路径 ( /)。
  • 根据网络环境和系统设置,浏览器可能会查询www.example.com两次 A 和 AAAA 记录,分别对应 IPv4 和 IPv6 地址。不过,这不会影响后续步骤。
    • 显然,如果你输入的是裸 IP 的 URL,DNS 将不会参与。
  • 浏览器可能出于以下几个原因选择使用 HTTPS:
    • 如果您在地址栏中输入整个 URL,并且它以 开头https://
    • 该域名有高速传输系统配置,或者更好的是,预加载到浏览器。(尝试访问hstspreload.org通过纯文本 HTTP,如果成功,请为您的浏览器提交错误报告。)
    • http://该特定 URL 之前已被访问过,并且从到 的HTTP 301 重定向https://已被浏览器缓存。
    • 浏览器配置为“始终使用 HTTPS”。
  • 如果浏览器决定使用 HTTPS 而不是纯文本 HTTP,则需要进行一些更改:
    • 规范化的 URL 以 开头https://
    • 默认端口现在是 443,即 HTTPS 的标准端口。
    • TLS 已启用,这增加了使用域名的另一个点,在名为 ClientHello 的初始数据包中,服务器名称指示扩展。这允许服务器在加密任何内容之前选择适当的证书。
    • 可以使用 HTTP/2 和 HTTP/3,这将改变 HTTP 请求的方式TLS 层内部被序列化。总体思路保持不变,因为请求仍然包含标准host标头,而请求行被一组新的伪标头(、 和:method:path所取代。:scheme:authority
    • 如果使用 HTTP/3,连接不再基于 TCP,而是 UDP。这是新的传输协议。

答案2

IP 堆栈实际上并不“了解”或“关心” IP。DNS 所做的只是告诉您“此域名位于此 IP”。

从“最简单”的意义上讲,这两种情况没有区别——只是就 IP 协议而言,你依靠 DNS 来解析 IP,而不是你自己的记忆(还有其他机制——主机文件本质上是“静态的”,每个机器的域名记录)。

但如果我们谈论的是网页来自 Web 浏览器的请求将包括它想要与之通信的主机名等信息。即使服务器的 IP 地址和指向该服务器的两个 Web 域 a.example.com 和 b.example.com 是同一个网站,您也可能获得不同的网页,具体取决于服务器的设置方式。

使用 HTTP - 因此您可以访问A网站(或错误消息),但可能不是您想要的网站 - IP 可能指向默认页面或只是登陆页面或错误页面。

HTTPS 是捆绑到域,因此您可能会收到可消除的错误(或不可消除的错误)

本质上,这取决于 Web 服务器的配置方式。

答案3

说我疯了吧,但目前没有一个答案包含“header”这个词,而对于 Apache、Nginx 等 Web 服务器来说,这是解析正确站点最重要的部分。主机头这使得您能够在单个 IP 上为多个站点提供服务。例如,nginx 将根据 中的配置进行匹配server_name。如果您想为没有域名(只有 IP)的站点提供服务,它将与标有 的服务器进行匹配default_server

答案4

该站点的证书主题备用名称中是否有 IP 地址,并且是否使用反向代理?

通过 URL 访问页面

假设您在浏览器的地址栏中输入“https://www.somesite.com/my/cool/page”并按回车键。

您的浏览器将把“www.somesite.com”解析为 IP 地址,例如 1.2.3.4。

浏览器知道https协议的默认端口是443。

然后它将在端口 443 上启动到该 IP 地址的 TCP/TLS 连接并发送 HTTP 请求 - 实际上只是一串文本:

GET /my/cool/page HTTP/1.1
User-Agent: Firefox(or whatever you're using)
Host: www.somesite.com
Accept: */*

空行在 HTTP 协议(​​这是一个旧协议)中用作分隔符,以便服务器知道客户端何时完成请求。服务器将解析这段文本以查找所有信息,并根据这些信息决定如何响应。在本例中,它将使用我的酷页面的 HTML 代码进行回复。

通过 IP 访问页面

但是假设您直接使用 IP 地址“https://1.2.3.4/my/cool/page”。

不需要 DNS 解析,因此您的浏览器会继续尝试像以前一样建立与服务器的 TCP/TLS 连接。

证书错误

您可能遇到的第一件事是服务器的证书可能会显示为不受信任。这是因为 x509 证书有一个名为“主题备用名称”的扩展,其中列出了服务器的受信任名称。如果您为请求指定的主机名或 IP 不在该列表中,则浏览器会告诉您证书无效并阻止您连接。

但是,我们假设证书确实列出了您正在使用的特定 IP,或者您忽略了证书问题。浏览器将连接到服务器并发送以下 HTTP 请求:

GET /my/cool/page HTTP/1.1
User-Agent: Firefox(or whatever you're using)
Host: 1.2.3.4
Accept: */*

请注意,由于浏览器没有服务器的 DNS 名称,因此它会恢复仅使用您提供的 IP 地址。

对于简单的网站来说这不是问题 - 只要请求到达,它就会根据路径(第一行的中间位指定您请求的确切页面)做出响应。

反向代理

然而,网站使用反向代理(nginx、traefik、caddy 等)是很常见的,它可以根据“主机”字段在多个后端 Web 服务器之间多路复用 HTTP 请求。

假设我正在运行两个不同的 Web 应用程序,app1 和 app2。它们是小型应用程序,可能依赖于一些共享资源,因此我想在单个服务器上运行它们。应用程序不能共享端口,在不同的端口上运行它们会很不方便,因为现在客户端必须指定它们要连接到哪个端口。相反,我可以使用反向代理。

我将为同一服务器 (IP) 设置两个 DNS 条目:“app1.somesite.com”和“app2.somesite.com”。然后我将配置我的反向代理以检查 HTTP“Host”标头,并根据请求的对象将传入请求定向到这两个应用程序。

因此,即使两个应用程序的 HTTP 请求都将发送到由 IP 地址标识的同一物理(或虚拟)服务器,反向代理也会使用 Host 字段在主机上运行的实际应用程序之间多路复用这些请求。

在这种情况下,仅通过 IP 地址发出请求可能会只能获得其中一个应用程序,或者都无法获得,具体取决于反向代理的配置方式。

相关内容