HTTP 标头的工作原理
在 HTTP/1.1 中,消息以请求行或状态行开头,后面是标头。每个标头都包含字段名、冒号和值。字段名不区分大小写,但部分值区分大小写。
HTTP/2 和 HTTP/3 使用帧对标头编码,并以 :method、:status 等伪标头代替文本形式的起始行。
GET /products HTTP/1.1
Host: example.com
User-Agent: ExampleClient/1.0
Accept: application/json
Cookie: session=abc123
这些请求标头分别标识目标主机、客户端、可接受的响应格式和会话。Content-Type、Cache-Control、Set-Cookie 等响应标头用于说明返回的数据,以及客户端应如何处理这些数据。
常见 HTTP 标头
- **Host:**标识目标主机,使一台服务器可以承载多个网站。
- **User-Agent:**标识客户端软件及其版本。参见 User Agent。
- Accept 和 Content-Type:
Accept指定期望的响应格式,Content-Type描述正在发送的消息体。 - **Cookie 和 Set-Cookie:**用于发送已保存的会话值和保存新值。参见 Cookie。
- **Authorization 和 Proxy-Authorization:**分别携带网站和代理的凭据。在代理认证中,两者不能互换。
认证令牌和会话 Cookie 属于敏感信息。不要将其暴露在日志、截图或错误报告中。
标头与消息体
| 标头 | 消息体 | |
|---|---|---|
| 用途 | 元数据和处理规则 | 内容或提交的数据 |
| 在 HTTP/1.1 中的位置 | 起始行之后 | 空行之后 |
| 示例 | 缓存规则和内容类型 | HTML、JSON 或图像字节 |
请求或响应可以只有标头,没有消息体。例如,HEAD 响应会返回描述资源的标头,但不包含资源内容。
代理如何处理标头
使用普通 HTTP 时,HTTP 代理可以读取标头,也可能修改标头。通过 CONNECT 隧道使用 HTTPS 时,代理通常可以看到目标主机和端口,但无法读取加密的 HTTP 标头。终止 TLS 的反向代理或检测网关则可以读取这些标头。
网站在机器人检测中,通常会比对 User-Agent、Accept-Language 和 Sec-CH-UA 等客户端提示。代理会改变网站看到的来源 IP,但无法让彼此不一致的标头显得真实。应使用客户端生成的标头,在同一会话中保持 Cookie 一致,并遵守网站的限制和条款。
常见问题
使用 HTTPS 时,HTTP 标头是否加密?
是。HTTPS 会加密 TLS 端点之间的标头和消息体。不过,目标域名仍可能通过 DNS、TLS SNI 或代理的 CONNECT 请求暴露。
代理能否修改 HTTP 标头?
可以,前提是代理能够读取 HTTP 消息。普通 HTTP 代理或终止 TLS 的网关可以修改标头,而传输加密隧道的代理通常无法修改。
HTTP 标头会泄露我的真实 IP 地址吗?
通常不会。浏览器一般不会在请求标头中写入用户的公网 IP,但中间设备可能会添加 Forwarded 或 X-Forwarded-For 等包含地址的字段。