在一个的服务器中,可能拥有多个 Host 的应用服务,此时仅仅通过 IP 无法访问到对应的服务,可通过 Host
来进行定位。
Host
是唯一客户端必须携带的请求头,如果缺失了该请求头则会返回 400 状态码。在 HTTP/2 以及 HTTP/3 中,以一个伪头 :authority
代替。
在浏览器中使用 fetch
,或者使用 curl/httpie
发送请求时,将会自动携带该请求头。
nc
可通过 nc
命令,直接以发送报文的形式来请求数据,我们可以在 Apifox 根据 Apifox Echo 对 Host 进行测试
$ nc echo.apifox.com 80
GET /get HTTP/1.1
Host: echo.apifox.com
HTTP/1.1 200 OK
Date: Wed, 21 Sep 2022 05:49:27 GMT
Content-Type: application/json
Content-Length: 200
Connection: keep-alive
Server: gunicorn/19.9.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
{
"args": {},
"headers": {
"Host": "echo.apifox.com"
},
"origin": "122.222.222.222",
"url": "http://echo.apifox.com/get"
}
如果不携带 Host
请求头,则直接返回 400 状态码。
$ nc echo.apifox.com 80
GET /get HTTP/1.1
HTTP/1.1 400 Bad Request
Server: awselb/2.0
Date: Wed, 21 Sep 2022 05:51:39 GMT
Content-Type: text/html
Content-Length: 122
Connection: close
<html>
<head><title>400 Bad Request</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
</body>
</html>
curl
如果通过 curl
模拟 Host,可通过请求 IP 地址,并明确指定 Host 头部。
# 请求成功
$ curl http.devtool.tech
# 获取到其 IP 地址
$ dig +short http.devtool.tech
76.223.126.88
# 直接请求 IP,导致找不到该应用
$ curl 76.223.126.88
# 请求成功
$ curl 76.223.126.88 -H "Host: http.devtool.tech"
作业
- 通过
nc
命令直接发送报文控制 Host 请求头的发送