你在浏览器地址栏里敲下一串数字,为什网站比如 `93.184.216.34`,通过回车——大概率会看到一个报错页面,地址或者跳转到某个奇怪的访问地方。但如果你敲的为什网站是 `example.com`,一切正常。通过IP 地址明明是地址网站真正的“门牌号”,为什么反而进不去?访问
这事得从 HTTP 协议的一个细节说起。当浏览器向服务器发送请求时,为什网站请求头里有一行叫 Host。通过你访问 `example.com` 时,地址这行写的访问是 Host: example.com;你用 IP 直接访问,这行就变成了 Host: 93.184.216.34。为什网站问题就出在这里——同一台服务器上可能跑着几十个甚至上百个网站,通过服务器收到请求后,地址靠 Host 这个字段来判断你到底想访问哪一个。
打个比方。你走进一栋写字楼,前台问你找哪家公司。你说“我找这栋楼”。前台懵了——楼里有做外贸的、有搞法律的、有写代码的,你到底找谁?IP 地址就是那栋楼的街道门牌号,Host 才是公司名。你不报公司名,前台没法把你领到正确的楼层。
这个机制叫“虚拟主机”。上世纪九十年代,互联网上的网站还不多,一台服务器配一个 IP 地址,一个网站独占一台机器,那时候用 IP 访问确实能打开。但网站数量爆炸之后,IPv4 地址不够用了。运维人员想出一个办法:让多个域名共享同一个 IP,服务器根据请求中的域名来分发内容。这个方案成本低、效率高,很快就成了行业标准。代价就是——你只给 IP 不给域名,服务器不知道该给你看哪个站。
有人可能会问:那我访问的那个 IP 上如果只跑了一个网站呢?理论上应该能打开吧?确实,有些小站用独立 IP,直接输 IP 也能看到内容。但即便在这种情况下,页面里的链接、CSS、JavaScript 文件往往写的是域名路径,浏览器加载这些资源时又会去查 DNS,最终还是绕回了域名。更别提 HTTPS 了——SSL 证书是绑定域名的,你用 IP 访问,证书校验直接失败,浏览器会弹出一大片红色警告。
我自己就踩过这个坑。之前调试一台新买的云服务器,Nginx 刚装好,想看看默认页面长什么样,在浏览器里输了公网 IP。结果出来一个“Welcome to nginx”的页面,我以为一切正常。后来绑了域名、配了虚拟主机,再用 IP 访问,直接 404。原因就是 Nginx 的配置文件里,那个默认的 server 块只匹配了域名,IP 请求没有对应的规则。
还有个容易被忽略的点:CDN。现在大部分网站前面都挂着 Cloudflare 或者阿里云 CDN。你查到的那个 IP 地址,根本不是网站真实服务器的地址,而是 CDN 边缘节点的地址。你用这个 IP 去访问,CDN 节点收到请求,发现 Host 字段不认识,要么返回错误,要么把你导向一个完全不相干的页面。相当于你拿着快递柜的地址去找寄件人,当然找不到。
所以结论很清楚:IP 地址是网络层的寻址手段,域名是应用层的身份标识。浏览器和服务器之间的对话,从一开始就是围绕域名展开的。IP 能帮你找到那台机器,但没法告诉机器你要什么。这就像你知道一个人的住址,但不知道他叫什么名字,敲开门之后对方问“你找谁”,你答不上来。
当然,技术上也有办法绕过这个限制。比如在本地 hosts 文件里把域名手动指向某个 IP,或者用 curl 命令加上 -H "Host: example.com" 头去请求。但这些操作普通用户不会做,也没必要做。域名系统本来就是为人类设计的,记名字比记数字容易得多。IP 访问网站这件事,不是“不能”,而是“协议不允许你随随便便就能”。