如何在HTTP If-None-Match请求头中正确向Web服务器回传Etag
HTTP缓存ETag传参规范
问题描述
基于Last-Modified与ETag响应头实现HTTP缓存机制时,常见服务端返回的ETag共3种格式:
- 无引号强ETag:示例值
wAUL9rDkgMueFoa7ZLPa/Vjx3ak - 带双引号强ETag:示例值
"a8ef0-5b8e443cf07ba-gzip" - 弱校验ETag:示例值
W/"17ba-WxSGP4eaXoBk6hGG35IOD+5mrwQ"
发起缓存校验请求时需要携带If-None-Match请求头,若资源未变更服务端会返回304状态码。需要明确的核心疑问是:回传ETag时是否需要移除外层引号、弱ETag是否需要去掉W/前缀。
标准答案
不要对从响应头中获取到的原始ETag值做任何修改,直接原样填入If-None-Match请求头即可,禁止手动移除引号、删除弱ETag的W/前缀。
规则细节
- 按照HTTP协议规范,双引号是强ETag值的法定组成部分,
W/前缀是弱ETag的固定标识,二者都不是多余的转义字符,一旦删除就会导致ETag值和服务端存储的原值不匹配。 - 无引号的ETag属于部分服务端的非标准实现,遇到这类值同样直接原样回传即可,不需要手动补充双引号。
- 只要保证缓存存储的ETag值和响应头返回的内容完全一致,回传时不做任何增删改,就能兼容所有合规、非合规的服务端实现,不会出现匹配失败的问题。
传参示例
- 收到带双引号的强ETag
"a8ef0-5b8e443cf07ba-gzip"时,正确传参:
错误做法是移除引号传If-None-Match: "a8ef0-5b8e443cf07ba-gzip"a8ef0-5b8e443cf07ba-gzip。 - 收到弱ETag
W/"17ba-WxSGP4eaXoBk6hGG35IOD+5mrwQ"时,正确传参:
错误做法是移除If-None-Match: W/"17ba-WxSGP4eaXoBk6hGG35IOD+5mrwQ"W/前缀和外层引号,传纯校验值17ba-WxSGP4eaXoBk6hGG35IOD+5mrwQ。 - 收到无引号非标准ETag
wAUL9rDkgMueFoa7ZLPa/Vjx3ak时,直接原样透传即可。
注意:部分CDN、反向代理会自动修改源站返回的ETag格式,只要你不主动修改拿到的原始值,就不会受这类代理逻辑影响。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

