直接用IP访问百度,我发现了···

文章讲述了在访问网站时,即使已知IP地址,仍需通过域名解析的原因。服务器通过请求头中的Host字段识别访问方式。直接使用IP地址会导致Host字段显示IP,服务器可能拒绝连接,如返回403错误。通过修改Host字段为域名,可以成功访问。同时,用HTTPS直接访问IP会触发浏览器SSL证书警告,因为证书绑定的是域名而非IP。

大家知道,访问网站的时候,会有一个域名解析的过程,客户端会先拿到网站的IP地址,然后通过IP地址来进行后续的HTTP通信。

那既然如此,如果我已经知道了网站的IP地址,是不是可以跳过域名解析的过程,直接拿着IP地址去请求呢?

以百度为例,我们ping一下百度的域名,拿到它的IP地址。

解析的IP地址是:14.119.104.189

那直接访问https://14.119.104.189,是不是也能打开百度?

结果他试了一下,发现被拒绝了!

然后这位球友就想不通了,为啥我跳过了第一步,直接用IP访问就不行呢?网站是如何做到不让直接用IP访问的?

从这个图中就可以合理的怀疑,是不是第二步中,客户端发过去的HTTP请求在使用域名和直接使用IP地址的时候有所不同,让服务器“察觉”出来你是直接使用的IP地址在访问网站,跳过了第一步。

大胆假设,小心论证,接下来我们就来看一下是不是这样。

因为HTTPS的通信是加了密的,为了看清楚通过域名访问和通过IP访问的时候,HTTP请求内容的区别,我们使用Fildder抓包软件,这样可以看到HTTPS加密的正文内容。

首先咱们通过域名来访问一下:

然后通过IP地址来访问一下:

放在一起一对比,在请求头中就只有两个地方不一样:

分别是Host字段和Cookie字段。

这样一看,真相基本就明确了,问题多半出在这个Host字段。

为了进一步验证,我们使用Postman来直接访问https://14.119.104.189,可以看到服务器返回了403错误!

然后,我们通过Postman修改一下Host字段,将其设置为域名www.baidu.com,再试一次:

这次能成功访问了!

至此,这位球友的问题就得到解答了:

客户端在发起HTTP请求的时候,会将其要访问的服务器地址填在Host字段。当使用域名访问的时候,这个字段的值就是域名,而通过IP地址访问的时候,这个字段的内容就是对应的IP地址。而服务器正是通过请求中的Host字段,识别出了客户端是直接通过IP访问的还是通过域名访问的。

最后给大家留一个思考题:

当我用HTTPS直接访问https://14.119.104.189的时候,浏览器给了我这样一个提示:

这不是百度自己的SSL证书吗?为什么会有这个提示出现?评论区说说看!

不可以,**直接使用百度的服务器 IP 地址访问百度网址**通常**无法正常工作**,主要原因如下: --- ## 🔍 问题分析: ### 1. **一个网站可能对应多个服务器 IP** 百度使用了 **CDN(内容分发网络)** 和 **负载均衡技术**,其域名 `www.baidu.com` 背后有多个服务器 IP 地址,并且这些地址会动态变化。即使你通过 `ping www.baidu.com` 获取到了一个 IP 地址,这个 IP 也只是 CDN 或前端负载均衡服务器的地址。 ### 2. **基于 Host 头的虚拟主机** 现代 Web 服务器(如 Nginx、Apache)都支持 **基于 Host 请求头的虚拟主机(Virtual Host)**。也就是说,服务器会根据你请求中 `Host:` 头的值来决定返回哪个网站的内容。 如果你直接使用 IP 地址访问,请求中没有正确的 Host 头,服务器无法识别你想要访问哪个网站,因此可能返回错误页面、默认页面或拒绝访问。 --- ## ✅ 示例说明: ### 获取百度IP 地址: ```bash ping www.baidu.com ``` 输出示例: ``` PING www.a.shifen.com (110.242.68.66): 56 data bytes ``` ### 使用 `curl` 直接访问这个 IP: ```bash curl http://110.242.68.66 ``` 返回的内容可能是: ``` <html> <head><title>400 Bad Request</title></head> <body> <center><h1>400 Bad Request</h1></center> </body> </html> ``` 或者一个空白页面,而不是百度首页。 ### 原因: 因为没有指定 `Host: www.baidu.com` 请求头,服务器不知道你想要访问哪个站点。 --- ## ✅ 正确做法:使用 Host 请求头 你可以使用 `curl` 指定 `Host` 头来模拟访问百度: ```bash curl -H "Host: www.baidu.com" http://110.242.68.66 ``` 这样服务器会识别你是想访问百度,返回百度首页的 HTML 内容。 --- ## 🧪 Python 使用 requests 实现相同效果: ```python import requests headers = { 'Host': 'www.baidu.com' } response = requests.get('http://110.242.68.66', headers=headers) print(response.text) ``` --- ## ⚠️ 注意事项: 1. **IP 地址可能随时变化**:百度IP 地址不是固定的,下次你 `ping` 可能会得到不同的结果。 2. **CDN 和防火墙限制**:某些 CDN 或服务器会阻止直接通过 IP访问。 3. **HTTPS 更复杂**:如果是 HTTPS 站点,还需要处理 SSL/TLS 证书验证问题。 --- ##
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值