ETag Inspect
Analyze cache-related headers across layers. No input is sent to a server. Use it for first-pass revalidation and CDN mismatch troubleshooting.
Status
Runs in your browser. No input is sent to a server. Use this as a first-pass diagnostic step.
How to use
Paste ETag/If-None-Match and click “Parse”. It lists strong/weak tags. If you paste both ETag and If-None-Match, it also shows weak/strong match checks.
Notes (this tool)
- Accepts ETag: / If-None-Match: header lines (multi-line paste is OK).
About this page
What does this tool do?
Parse ETag/If-None-Match and show strong/weak tags. If you paste both ETag and If-None-Match, it also shows weak/strong match checks.
Useful for debugging cache issues (unexpected/missing 304).
ETag basics
- ETag is a resource version identifier.
- If-None-Match is used for cache validation.
- Weak ETags (W/) indicate semantic equivalence.
Syntax (how to read)
ETag is usually a quoted value; weak ETags are prefixed with W/. If-None-Match is a comma-separated list of ETags or *.
- ETag: "abc123"
- ETag: W/"abc123"
- If-None-Match: "a", "b", W/"c"
- If-None-Match: *
304 (Not Modified) and ETag
ETag is a key for cache validation. Clients send If-None-Match; if the server considers it a match, it can respond with 304 and skip the body.
- No 304: ETag changes/missing, or conditional request isn’t sent
- Too many 304: ETag not updated or cache design differs from intent
Cache-Control and revalidation
ETag is used during revalidation. Depending on your Cache-Control policy, revalidation may happen too often—or not at all.
- Short max-age: more revalidation (If-None-Match sent more often)
- no-cache: revalidate every time (body may be skipped with 304)
- immutable: reduces revalidation (pairs well with hash-in-filename assets)
To narrow down issues, check not only ETag matching but also Cache-Control / Expires / Vary.
Strong vs weak ETag
Strong ETags represent byte-for-byte identity; weak ETags represent semantic equivalence. Misuse can cause stale content or unnecessary revalidation.
- Compression/transformations may change ETag
- Behind CDNs, origin and edge ETags may differ
Vary: Accept-Encoding and ETag
Even for the same URL, compression (gzip/br) changes the response bytes. With strong ETags, different encodings can look like different resources.
- Without Vary: Accept-Encoding, caches may mix compressed/uncompressed variants
- With edge transforms (image optimization/minify), origin and edge ETags may differ
Common issues behind CDN/proxies
CDNs/reverse proxies may change the meaning of ETag through compression, optimization, or cache rewrites. It matters who generated the ETag (origin vs edge).
- An origin ETag may be replaced/removed at the edge
- If servers generate different ETags, ETag may change without content changes
Typical use cases
- No 304; always 200
- Over-caching; updates not reflected
- ETag changes behind proxy/CDN
Privacy/security notes
ETag is for cache validation, but depending on implementation it can behave like a user identifier, so privacy considerations matter.
- Per-user ETags make shared caching and debugging harder
- Do not embed sensitive data in ETags (they often end up in logs/monitoring)
Debugging workflow (recommended)
- Use Response Headers Parser to check ETag / Cache-Control
- Check If-None-Match via Request Headers Parser
- Split ETags here to organize strong/weak and multiple values
Troubleshooting checklist
- ETag changes every time: suspect multi-server differences, build variance, compression, transforms, or CDN rewrites
- If-None-Match not sent: check Cache-Control policy, DevTools “Disable cache”, and Service Worker
- UI not updated despite 304: other cache layers (SW/memory) or stale referenced assets
Related tools
- Cache-Control Inspect
- Response Headers Parser / Request Headers Parser
Recommendations (practical)
- Always include ETag or Last-Modified for APIs/HTML
- When supporting Range, pair with If-Range
- If ETag changes every time, inspect generation and intermediaries
What this tool does
- Split ETag/If-None-Match values (header lines and multi-line paste supported)
- Identify weak/strong tags
- Check ETag vs If-None-Match matches (weak/strong comparison)
Note: If-None-Match evaluation depends on HTTP method, etc. This tool shows weak/strong comparison results as guidance.
Operational notes
- Cache behavior changes across browser, CDN, and proxy layers, so compare captures from the same observation point.
- Header-only diagnosis may be insufficient. Also review application cache invalidation strategy and key design.
Referenced specs
- RFC 9110 (HTTP Semantics)
- RFC 9111 (HTTP Caching)
- MDN: ETag / If-None-Match
FAQ
What if ETag is missing?
Conditional validation may not work and you may always get 200 bodies (Last-Modified may be used instead).
What does * mean in If-None-Match?
It is a special value meaning “match anything”, often used for existence checks.
References
Next to view (diagnostic order)
These links are generated from site_map rules in recommended diagnostic order.
- How to Diagnose Missing 304 Responses — Trace ETag/Last-Modified and If-* round trips to isolate missing 304 behavior
- Vary Inspect — Parse Vary and visualize cache variation keys
- Cache-Control Inspect — Parse and interpret Cache-Control directives
- Last-Modified Inspect — Parse Last-Modified and If-Modified-Since
- Cache Control Overview — Summarize how to use Cache-Control/Pragma/Expires together
- Cache Validator Overview — Summarize relationships among ETag/Last-Modified validators
- ETag Builder — Build ETag values for testing and operations
- If-None-Match Inspect — Parse If-None-Match and inspect revalidation conditions
Same-theme links
Cache Validators
Connect ETag/Last-Modified and If-* to judge revalidation flow
- Cache Validator Overview — Summarize relationships among ETag/Last-Modified validators
- ETag Builder — Build ETag values for testing and operations
- If-None-Match Inspect — Parse If-None-Match and inspect revalidation conditions
- If-Match Inspect — Parse If-Match and inspect update preconditions
- If-Modified-Since Inspect — Parse If-Modified-Since and inspect conditional retrieval
- If-Unmodified-Since Inspect — Parse If-Unmodified-Since and inspect precondition behavior
- Last-Modified Inspect — Parse Last-Modified and If-Modified-Since