当我学习网络和 DNS 服务器以及其他知识时...我很好奇,您能通过在地址栏中输入 IP 地址来访问网站吗?
答案1
总结这取决于服务器的配置。一个简单的正面例子是一一一一/1.1.1.1。
我假设您正在按照计算机网络课程的常规讲座了解如何访问网站,其中列出了以下步骤:
www.example.com
在浏览器地址栏中输入并按 Enter。- 浏览器在 DNS 中查找
www.example.com
并检索其 IP 地址。 - 浏览器与其中一个已获知的 IP 地址建立 TCP 连接。由于您未指定端口,浏览器将使用 HTTP 协议的默认端口 (80)。
- 浏览器向服务器发送 HTTP 请求。
- 浏览器接收 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,但它们肯定有类似的设置。server
server
default_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”。
- 如果您在地址栏中输入整个 URL,并且它以 开头
- 如果浏览器决定使用 HTTPS 而不是纯文本 HTTP,则需要进行一些更改:
答案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 地址发出请求可能会只能获得其中一个应用程序,或者都无法获得,具体取决于反向代理的配置方式。