HTTP 头解析完全指南:请求/响应头、缓存与安全字段
联调时从浏览器开发者工具或 curl -v 复制出一大段 Headers,往往只能「肉眼扫」。本指南说明如何用 WebUtils HTTP 头解析器把原始头文本拆成结构化字段,结合 Cache-Control、CORS、内容协商与安全相关头的读法,给出步骤、误区与场景,让「这段头到底在说什么」变得可检查、可对照。
核心一句话
HTTP 头是机器契约的人读版:解析器帮你拆字段,判断对错仍要对照协议与你的网关配置。
主工具:HTTP 头解析器。在文本框粘贴原始头,点击「立即解析分析」,在结果表中逐项查看。
请求头与响应头分别在说什么
基本形态
HTTP/1.1 头大致是「字段名: 值」每行一对,字段名大小写不敏感,值的解释则高度依赖字段语义。空行之后才是 body——本工具关注头,不负责解析 body 实体。
高频字段速览
| 类别 | 示例字段 | 你要问的问题 |
|---|---|---|
| 内容 | Content-Type, Content-Length, Content-Encoding |
身体是什么格式?有没有压缩?长度是否对得上? |
| 缓存 | Cache-Control, ETag, Last-Modified, Vary |
谁可以缓存?缓存多久?何时必须再验证? |
| 协商 | Accept, Accept-Language, Accept-Encoding |
客户端能吃什么?服务器是否尊重? |
| 代理与真实 IP | X-Forwarded-For, Via, Forwarded |
经过几层代理?客户端地址是否被伪造风险? |
| 跨域 | Origin, Access-Control-Allow-* |
浏览器会不会拦?预检是否通过? |
| 安全 | Strict-Transport-Security, Content-Security-Policy, X-Frame-Options, Set-Cookie 属性 |
是否强制 HTTPS?能否被嵌入?Cookie 是否 HttpOnly/Secure? |
| 认证 | Authorization, WWW-Authenticate, Proxy-Authorization |
方案是 Bearer/Basic 还是其它?令牌是否不该出现在日志? |
Cache-Control 常见指令(响应侧直觉)
no-store:别存。敏感接口常用。no-cache:可存但用前必须再验证(名字容易误导)。max-age=秒:新鲜时间。private/public:只能私缓还是可共享缓存。must-revalidate:过期后必须验证。
多种指令可组合,解析后应逐项理解,而不是只看第一个词。
CORS 相关
浏览器跨域读响应时看 Access-Control-Allow-Origin 等。服务器「看起来返回 200」不等于前端能读 body——若 ACAO 不匹配,控制台会报 CORS,和业务状态码是两层问题。解析器帮你把这些头摊开,避免和 HTTP 状态码 混淆。
在 WebUtils 上怎么做
- 打开 /tools/network/http-header-parser。
- 从浏览器 Network 面板、
curl -v、网关日志或 Postman 复制 原始头文本(可含请求行/状态行,或纯Key: Value列表)。 - 粘贴到
headerInput。 - 点击 立即解析分析(
analyzeBtn)。 - 在
resultsArea/resultBody查看拆分后的字段表:逐行确认名称、值、是否有重复键。 - 对可疑字段(缓存、CORS、Set-Cookie、Authorization)单独做决策:是否符合环境预期。
粘贴示例(响应头教学用,非真实密钥)
HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Cache-Control: no-store Access-Control-Allow-Origin: https://example.com X-Content-Type-Options: nosniff
解析后应能分别看到内容类型、禁止存储缓存、CORS 来源与 MIME 嗅探防护。若某行缺少冒号或折行不符合规则,结果可能合并错误——回到源文本检查。
常见错误对照
| 现象 | 可能原因 | 处理 |
|---|---|---|
| 解析表缺字段 | 复制时只选了部分;或 HTTP/2 伪头在工具中的展示差异 | 重新复制完整块;H2 场景对照浏览器已规范化列表 |
Cache-Control: no-cache 仍被缓存 |
语义是「用前验证」不是「禁止存储」 | 敏感数据用 no-store;并查 CDN 规则 |
| 前端报 CORS,服务端坚称正常 | 缺 ACAO / 凭证模式不匹配 / 预检失败 | 解析响应头;对照 Origin 与 Allow-Credentials |
Content-Type 与真实 body 不符 |
网关默认类型、错误包装 | 结合实际 body 与状态码,不只信头 |
| 重复的同名头 | 代理叠加、框架重复写入 | 明确合并规则(有的用逗号合并,有的覆盖) |
Authorization 出现在截图/工单 |
泄露风险 | 解析教学时打码;生产日志脱敏 |
| Set-Cookie 看似成功但前端读不到 | HttpOnly;或 Domain/Path/Secure/SameSite 限制 | 解析属性;不要在 JS 里指望读到 HttpOnly |
| 中文头值乱码 | 历史上曾有非标准编码;现代应遵循规范 | 避免非 ASCII 裸放;用 RFC 允许的编码形式 |
真实场景
1. API 联调:Postman 通、浏览器不通
Postman 不受浏览器 CORS 限制。把浏览器失败请求的响应头贴进解析器,常能直接看到缺 Access-Control-Allow-Origin 或 Allow-Headers 不包含自定义头。
2. CDN / 缓存「改了代码仍旧页面」
解析响应:Cache-Control、Age、CF-Cache-Status(若有)、ETag。区分浏览器缓存、CDN 缓存与服务端无缓存头被默认私缓。需要强刷时,文档化应使用的版本号或 no-store 策略,而不是让用户「清一下缓存」当唯一方案。
3. 安全基线巡检
定期抽样生产响应头:是否有 HSTS、是否错误地 Access-Control-Allow-Origin: * 且还带凭证、Cookie 是否缺 Secure。解析器适合把一次抓取变成表格 checklist,再进入工单。
4. 网关与微服务透传
多级代理后 X-Forwarded-For 链变长。解析后数清跳数,和运维约定哪一层是可信边界,防止应用层随便信任最左 IP。
5. 授权头与 JWT
Authorization: Bearer eyJ... 出现时,解析器帮你确认字段存在;令牌内容应转到 JWT 解码 并注意本地脱敏。头解析页不负责校验签名。
检查清单
- [ ] 粘贴来源明确(请求还是响应)
- [ ] 敏感头已脱敏
- [ ] Cache-Control 语义按指令逐条理解
- [ ] CORS 与是否携带 Cookie 一并考虑
- [ ] Content-Type 与真实 body 抽查一致
- [ ] 重复头已标记并查看来源中间件
常见问题
请求行 / 状态行要不要一起粘贴?
可以。许多原始导出包含首行。解析器主要提取 Name: Value;首行用于你自己确认这是 200 还是 301。若首行被误解析成字段,删掉再析。
HTTP/2 和 HTTP/1.1 头有什么拷贝差异?
浏览器 Network 常显示已整理的头。H2 使用伪头如 :method。以你复制到的文本为准;对比问题时尽量同一工具导出。
`*` 的 CORS 和带 Cookie 的请求能同时用吗?
携带凭证的跨域响应不能随意用 Access-Control-Allow-Origin: ,浏览器会拒绝。解析看到 且前端 withCredentials 时,应改为明确源并配合 Allow-Credentials: true(仍需服务端正确配置)。
为什么有的头在浏览器里看不见?
受安全限制,JS 不能读某些响应头,除非 Access-Control-Expose-Headers 声明。这与「网络里是否真实存在」不同。用 DevTools 网络面板或 curl 看权威结果。
Cache-Control 和 Expires 同时存在听谁的?
现代实现通常优先 Cache-Control。解析两者都在时,以 Cache-Control 做主决策,并检查中间缓存是否老旧。
可以把生产 Authorization 贴上来「看看」吗?
不建议。即使用本地工具,剪贴板与截图仍可能泄露。用伪造样例或打码后再分析结构。
解析结果能否代替安全扫描?
不能。本工具做结构化阅读与人工审计辅助,不替代专业扫描器对 CSP 强度、Cookie 固定等的评估。
和「响应头检查」类工具如何分工?
若目标是评分/基线列表,用专门安全头检查;若目标是理解这一次真实响应里每一行在说什么,用本解析器。
小结
HTTP 头决定缓存、跨域、内容类型与大量安全策略。WebUtils HTTP 头解析器把原始文本变成可扫的字段表,适合联调、CDN 问题与配置巡检。把它和状态码、URL、JWT 工具配合,能把「浏览器报了一长串红字」收敛成可执行的配置修改项。
读头时的分层方法
建议把一次粘贴结果分成四层阅读,而不是从头到尾扫字:
- 身份层:请求方法/路径或状态行、Host、权威来源。确认「这是哪一次交换」。
- 身体契约层:
Content-Type、Content-Length/Transfer-Encoding、Content-Encoding。确认「身体怎么读」。 - 缓存与复用层:
Cache-Control、ETag、Vary、CDN 自定义头。确认「谁可以存、存多久」。 - 浏览器安全层:CORS、CSP、HSTS、Frame 相关、Cookie 属性。确认「浏览器会不会拦、会不会带凭证」。
每一层只回答一个问题。联调争议时常把四层混在一句「接口有问题」里,解析表的价值就是强迫分层。
代理与重复头的实务处理
生产流量很少「直连源站」。解析时若看到多个 Via 或重复 Set-Cookie、重复 Cache-Control:
- 先按时间线还原:浏览器 → 边缘 CDN → 源站网关 → 应用
- 再问:冲突时谁说了算?有的团队规定「最外层覆盖」,有的规定「应用层优先」
- 最后才改配置,避免在错误的一层加头
把解析器输出贴进变更单时,注明采样环境(生产/预发)与是否经 CDN,否则同事会拿直连结果和你对线。
安全头最小可读集
不必一次背完整 CSP,但抽样响应时至少能解释这几项:
| 头 | 若缺失或过宽,风险直觉 |
|---|---|
Strict-Transport-Security |
用户可能被降级到明文 HTTP |
X-Content-Type-Options: nosniff |
浏览器更易被错误 MIME 诱导执行 |
Content-Security-Policy |
XSS 与第三方脚本约束变弱 |
Referrer-Policy |
可能向第三方泄露完整 URL |
Permissions-Policy |
摄像头/地理等能力口子过大 |
Set-Cookie 的 Secure/HttpOnly/SameSite |
会话更容易被窃取或跨站发送 |
解析器负责「看见」;是否达标要对照你们的安全基线。看见之后,才能写得出「缺什么、改哪台网关、如何回归」。
工单回复话术(可改写)
- 「浏览器 CORS 失败:响应缺少与
Origin匹配的Access-Control-Allow-Origin,与业务 200 无关。」 - 「页面旧:边缘节点
Cache-Control允许长期 public 缓存,发版未改版本号。」 - 「Cookie 未带上:
SameSite=Lax且跨站 POST,或缺Secure在 HTTPS 页。」
这类句子都建立在解析表字段之上,比「清缓存试试」更可验证。