您可以通过在地址栏中输入 IP 地址来访问网站吗?

Jer*_*my 10 dns url web http cross-browser

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

iBu*_*Bug 37

TL;DR这取决于服务器的配置。一个简单的正面例子是one.one.one.one / 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

Run Code Online (Sandbox Code Playgroud)

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

GET / HTTP/1.0
Host: 192.0.2.1

Run Code Online (Sandbox Code Playgroud)

大多数常见的HTTP服务器(Nginx、Apache、IIS等)都有一个称为“虚拟服务器”的概念,它是根据域名(HTTPHost标头)选择配置。这就是答案所在的部分:这取决于服务器。某些服务器可能会返回同一站点的裸 IPHost标头,而另一些服务器可能不会。服务器的行为均按照管理员的配置进行。

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


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

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

  • @9072997 你是对的:*按照标准*不需要任何标头,但是任何服务器*实际上*都需要 Host 才能返回有意义的内容。 (2认同)

Jou*_*eek 25

IP 堆栈并不真正“意识到”或“关心”IP。DNS 所做的只是告诉您“此域名位于此 IP”。

从“最简单”的意义上来说,这两种情况没有区别 - 只是您依赖 DNS 来解析 IP 而不是您自己的内存(还有其他机制 - 主机文件本质上是“静态”的,每台机器域名记录)如下就IP协议而言。

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

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

HTTPS与域绑定,因此您可能会收到可忽略的错误(或不可忽略的错误)

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

  • 我认为你必须独立考虑两者: (a) 传输连接 (TCP) 和应用程序协议 (HTTP):虽然任何连接都只使用 IP 地址(和端口),但 HTTP 可能会对“GET”的方式产生影响URL 看起来像(例如:*基于名称的虚拟服务器*)。 (3认同)
  • “HTTPS 与域绑定”——通常是的。也就是说,[似乎可以在 IP 地址上执行 HTTPS](/sf/ask/143053221/)。虽然我不知道他们从证书的角度是如何做到这一点的,但 Cloudflare 对 IP 地址进行了 HTTPS [此处](https://1.1.1.1)。诚然,这种情况很少见,但我_认为_这是可能的。不过可能是错的 (3认同)
  • @U.Windl TLS 使分离变得复杂 (2认同)

Tho*_*mas 23

你可以说我疯了,但当前的答案都不包含“标头”一词,这是 Apache、Nginx 等 Web 服务器解析正确站点的最重要部分。主机标头使您能够在单个 IP 上为多个站点提供服务。例如,nginx 会将其与 中配置的内容进行匹配server_name。如果您想为没有域(仅 IP)的站点提供服务,它将再次匹配标有 的服务器default_server

  • HTTPS 下第二重要的。HTTPS Web 服务器可以配置为要求 [SNI](https://en.wikipedia.org/wiki/Server_Name_Induction) 识别用于服务器的 TLS 证书:“如果一台服务器在单个侦听器上托管多个站点,则服务器无法知道在 TLS 协议中使用哪个证书”。否则,服务器和客户端就无法建立 TLS 连接以达到客户端能够发送标头的目的。 (3认同)