HTTP 请求头中的 Host 你了解吗

3,380 阅读1分钟

在一个的服务器中,可能拥有多个 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"

作业

  1. 通过 nc 命令直接发送报文控制 Host 请求头的发送