同一份请求,直接发给目标站和经过代理转发出去,目标站看到的头字段往往不完全一样。有的字段被追加、有的被改写、有的被删掉,代理做这些事多数是为了让转发正常工作,但也会在请求上留下明显的转发痕迹。知道哪些字段会被动,就能判断自己的请求在链路上经历了什么。
新增的头:转发时最常见的动作是追加。代理通常会在请求里补上 X-Forwarded-For(依次记录途经的地址)和 Via(标明经过的代理类型与版本),把链路信息留给下游。这类字段不是请求方写的,而是中间层加的,目标站经常拿它们判断流量是否经过转发。
被改写的头:最典型的是 Host。请求行里的目标地址会被标准化,补全默认端口;部分代理还会统一 User-Agent 的写法,或补上 Accept 相关字段。改写的目的是让请求看起来规整,但也会改变目标站看到的请求面貌。
被删掉的头:一些逐跳头只在一跳之内有效,比如 Connection 和 Keep-Alive。代理转发时必须去掉或改写,否则会把只针对上一跳的指令带到下一跳,造成语义错乱。这类删除是协议要求,不是代理自作主张。
原样透传的头:与业务相关的头,比如 Cookie、Authorization、Accept-Language,代理一般不做改动,原样透传。所以换出口并不会重置登录状态,凭据还是那套凭据——这也提醒使用者,更换出口不等于更换身份。
为什么代理要动这些字段
目的只有一个:让转发这件事成立。追加是为了让下游能识别链路信息,改写是为了符合协议规范,删除是为了避免指令越跳。三类操作都是代理身份的印记,只要目标站愿意,都能通过字段组合推断出流量经过转发。这不是缺陷,而是转发协议的既定行为,理解这一点,就不会对“加了头就暴露”感到意外。
怎么把它当成检查工具
对使用者来说,头字段是判断请求有没有按预定路径走的最直接窗口。如果预期走代理,回显里却找不到任何代理追加的字段,说明分流可能没有生效;反过来,如果出现不认识的中转标记,说明链路上多了没计划的环节。定期对照头字段的变化,是验证代理链路状态既便宜又可靠的办法。
需要注意的是,头字段的改动范围由协议与代理配置共同决定,不同服务商的处理并不完全一致。判断时不要只看某一个字段,把新增、改写、透传三类放在一起看,结论才可靠。
- 新增字段是转发痕迹:X-Forwarded-For 与 Via 一出现,就能认出链路
- 改写与删除集中在逐跳头:Host 与 Connection 最典型
- 业务头基本透传:换出口不会重置登录凭据
把这三件事记在心里,再观察请求经过代理IP后的头字段变化,链路是否按预期工作一目了然,排查方向也不会跑偏。
