请求头里能塞什么:改了它,服务器给你的页面就不一样

请求头里能塞什么:改了它,服务器给你的页面就不一样

一、请求头是什么

浏览器每次访问网站,除了送出网址,还会附带一组"说明":我接受什么语言、什么压缩格式、从哪个页面跳过来、用什么客户端。这些说明就是请求头。服务器据此决定返回什么内容,也据此判断你是谁。

命令行工具允许自定义这些说明,于是就有了调试与测试的空间。

二、三种典型用法

用法效果说明
加一个头指定语言偏好,例如让站点返回英文版服务器按 Accept-Language 选择语言版本
加两个头语言偏好 + 自定义头同时生效常用来测试网关、CDN、后端的透传与过滤
加一个空头只发送头名称、不带值用一个小技巧:在名称后加分号,就会变成空值头

三种用法对应三类需求:验证内容协商、验证链路是否篡改或丢弃自定义头、验证服务端对空值的容错。

三、为什么"空值头"值得单独测

很多线上故障不是"头被改错",而是"头被丢掉"或"值变成空"。服务端拿到空值时是否按默认值处理,直接决定接口会不会报错。

空值头是一种低成本探针:它能暴露服务端在解析、校验、默认值兜底上的薄弱环节。这类问题在正常请求里几乎不会出现,一旦出现(比如中间代理清空了某个头的值),就会变成线上事故。

四、实际排查中怎么用

  1. 验证内容协商。同一地址分别带不同语言偏好请求,比对返回内容是否真的变化。
  2. 验证透传。发一个自定义头到后端,看日志里能否看到;看不到就说明中间层丢弃了它。
  3. 验证缓存。不同头的组合会不会命中同一份缓存,是 CDN 配置的常见坑。
  4. 验证鉴权。把认证头改空、改错、去掉,观察服务端是否正确拒绝——这一步能直接暴露越权风险。

五、三条注意

  • 头名称大小写不敏感,值敏感。名称随便写,值差一个字符结果就不同。
  • 别用改头来"绕过"限制。伪造来源、伪造身份这类做法属于攻击行为,正常测试请在自己有权测试的系统内进行。
  • 记录你发了什么。排障时最怕"改了但没记",尤其是多轮对比测试。

请求头看起来只是几行参数,实际上是客户端和服务端之间最容易被忽视的约定层。它出问题时不报错,只返回错的东西——这比报错更难查。