curl -sI http://127.0.0.1/api/item/1 -H 'If-None-Match: "abc123"' # 期望 304
自研网关拼条件请求头时写成 If-None-Match: abc123,服务端一直返回 200,日志里这个头解析出来是空值,304 一次都没有。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,ETag 的值必须带双引号,比较时逐字比对。少了引号就是另一个字符串,永远匹配不上。多层代理改写头部时也容易把引号吃掉。
这次卡住的地方就在「If-None-Match 格式」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
处理上按这个顺序:拼头时保留引号 原样透传服务端返回的 ETag;网关不要对 If-None-Match 做 trim 或去引号;多个 ETag 用逗号分隔 每个都带引号;抓包确认发出去的头和服务端收到的一致。
改完只确认一件事:带引号的条件请求返回 304 网关日志里能解析出完整的 ETag 值。
