Chrome请求带相同ETag返回200 OK但curl请求返回304 Not Modified问题求助
问题排查方向与解决方案
- 检查浏览器开发者工具「网络」面板是否勾选了禁用缓存选项,该选项开启时浏览器会自动在请求头携带
Cache-Control: no-cache,Spring的ShallowEtagHeaderFilter收到该头会跳过304校验逻辑,直接返回200。 - 核对浏览器实际发出的请求头中是否包含
If-None-Match字段,值是否与前一次响应返回的ETag完全一致:- 若缺失该字段,首先检查跨域配置:由于你开启了
withCredentials: true,需确认服务端CORS配置的Access-Control-Allow-Headers列表包含If-None-Match,否则跨域请求时浏览器会自动屏蔽该请求头,导致服务端无法做ETag校验。 - 若跨域配置无问题,是因为Axios默认不会自动处理ETag缓存逻辑,你可以选择两种方案处理:
- 在Axios响应拦截器中存储每个请求URL对应的ETag值,在请求拦截器中为对应请求主动添加
If-None-Match头 - 服务端给响应添加
Cache-Control: public, max-age=0头,告知浏览器自动处理缓存校验,自动在后续请求携带If-None-Match头
- 在Axios响应拦截器中存储每个请求URL对应的ETag值,在请求拦截器中为对应请求主动添加
- 若缺失该字段,首先检查跨域配置:由于你开启了
- 确认当前请求为GET方法:
ShallowEtagHeaderFilter默认仅对GET请求、且响应状态码为200的请求生成ETag并做校验,其他请求方法默认不生效。 - 确认响应头未返回
Cache-Control: no-store:该配置会禁用所有缓存逻辑,ETag校验也不会生效。
内容的提问来源于stack exchange,提问作者wanglong
相关产品推荐
相关产品推荐

