ETag and Last-Modified revalidation
ETag and Last-Modified — the headers that let a browser ask whether anything has changed and get a short 304 back instead of the whole page.
Validators let a browser ask the server “has this changed since my copy?” instead of downloading the page again. There are two: ETag, an identifier of the current version of the response (often a hash), and Last-Modified, the time of the last change. On the next visit the browser sends them back as If-None-Match or If-Modified-Since. If nothing changed, the server answers 304 Not Modified with no body — a few hundred bytes instead of the whole page.
How SiteScan checks it
The scanner looks for both headers on the home page HTML and lists the ones it found. One of them is enough for a green row. With neither, the row says “Missing” and is amber: every reload transfers the full HTML even when nothing on it has changed. Combined with a missing Cache-Control, the scan also reports that every visit re-downloads the page in full.
How to enable them
Static files usually get both automatically: nginx and Apache send ETag and Last-Modified by default. Dynamic pages are where they go missing. Most frameworks have a switch or middleware for this — for example ETag middleware in Express or conditional GET in Django. Behind a load balancer, make sure the ETag does not differ between servers for the same content, or the 304 never happens. See also the guide to HTTP caching.
See this check on your own site
Run a free scan: the report shows this row for your domain along with the other checks of the site audit.
More in “Delivery & reputation”
What SiteScan checks
TLS certificate
- TLS certificate expiry
- Outdated TLS versions (TLS 1.0/1.1)
- TLS certificate chain
- TLS certificate issuer
- Certificate signature algorithm
Domain registration
- Domain registration expiry
- Registered domain name
- Domain registrar
- Domain registration date
- Domain last updated date
- Domain status codes (EPP)
- Domain transfer lock
- Registrar abuse contact
- RDAP and WHOIS data source
Indexing
- robots.txt file
- CSS and JS blocked in robots.txt
- XML sitemap
- Sitemap index file
- Off-domain URLs in the sitemap
- Sitemap lastmod dates
- Broken URLs in the sitemap
- RSS and Atom feed
Addresses & redirects
Security headers
- HTTP security headers and grade
- Strict-Transport-Security (HSTS) header
- Content-Security-Policy (CSP) header
- X-Content-Type-Options: nosniff
- X-Frame-Options and clickjacking
- Referrer-Policy header
- Permissions-Policy header
- HSTS preload list
- CORS and cross-origin reads
- HTTP TRACE method
Delivery & reputation
- Cache-Control header for HTML
- ETag and Last-Modified revalidation
- HTTP/3 and QUIC support
- Server version disclosure in headers
- DNS blocklist (DNSBL) check
Internal links
Exposure
- Exposed sensitive files (.env, .git, backups)
- Directory listing enabled
- Public JavaScript source maps
- Exposed WordPress endpoints
Well-known files
- security.txt file
- llms.txt for AI assistants
- llms-full.txt file
- ads.txt authorized sellers file
- humans.txt file
- Well-known change-password URL
DNS & email
- MX records (mail servers)
- SPF record
- DMARC record and policy
- DNSSEC signing
- CAA record
- Nameserver redundancy
- IPv6 support (AAAA record)
- MTA-STS policy
- TLS-RPT reporting record
- BIMI record (brand logo in email)
- Wildcard DNS record
- Dangling CNAME and subdomain takeover
Privacy & consent
- Analytics and tracking scripts
- Cookie consent banner
- Privacy policy link
- Terms of service link
- Imprint (Impressum)
- Accessibility statement
Core Web Vitals
- Lighthouse performance score
- Largest Contentful Paint (LCP)
- Cumulative Layout Shift (CLS)
- Interaction to Next Paint (INP)
- CrUX field data vs lab data