Result
| Header | Status | Why |
|---|
How to use the tool
Paste the URL of a page, a PDF or an image and click “Analyse”. The tool sends a GET request, follows up to ten redirects and shows the chain it got: the status code and URL of each step, then the final response. The table then lists the headers that matter, sorted into four groups: SEO and crawling, cache, compression, security.
Each row has a status. “Present” means the header is there and raises no known issue, “Missing” that it is absent, which is sometimes fine, and “Review” that it is there but its value deserves a look. The right-hand column says why, with the number of the source. The tool computes no overall score: a missing security header matters little on a brochure page without forms, a lot on a customer account area. Below the table you get the full list of headers received, in order and duplicates included.
Headers that matter for SEO
Headers are invisible in the page, but Googlebot reads them before anything else. The one with the heaviest consequences is X-Robots-Tag. Google accepts in this header every rule of the robots meta tag: noindex, nofollow, nosnippet, max-image-preview and the others. Several X-Robots-Tag headers can be combined, one line can target a specific crawler (“googlebot: noindex”), and when rules conflict, the more restrictive one applies.1 A noindex set here by a forgotten server setting removes the page from results with nothing showing in the HTML.
These rules are only read if robots.txt lets the crawler fetch the page.1 Blocking a page in your robots.txt rules while giving it a noindex therefore makes that noindex invisible.
The Link header can carry a canonical: “Link: <https://www.example.com/white-paper.pdf>; rel="canonical"”. Google supports it for web search, including for files without HTML such as PDFs, and asks for an absolute URL, as in the tag. It also recommends picking a single method: giving one canonical in the header and another in the HTML is error-prone.2
Content-Type declares the document type and, through its charset parameter, its character encoding, for example “text/html; charset=utf-8”.3 Vary lists the request headers that change the response; caches keep one version per value, and “Vary: *” makes the response uncacheable.4 Google ties “Vary: user-agent” to dynamic serving, where one URL serves different HTML to mobile and desktop.5
ETag, Last-Modified and conditional crawling
In a December 2024 post, Gary Illyes of Google reports that about 0.026% of Google’s fetches were cacheable ten years ago, against 0.017% today. He also explains that allowing caching may help a large site with rarely changing content get crawled more efficiently.6
The mechanism relies on two pairs of headers. The server sends an ETag, a fingerprint of the page version; on the next visit, the crawler sends it back in If-None-Match. If nothing changed, the server answers 304 Not Modified with no body: it neither builds the page nor sends it. Last-Modified and If-Modified-Since do the same with a date. Google recommends ETag, which is less error-prone since its value has no imposed structure, and suggests setting both when possible. For Last-Modified, it recommends the “Fri, 4 Sep 1998 19:15:56 GMT” format and suggests adding Cache-Control: max-age, the number of seconds the content should stay unchanged.6 When both headers are present, Google’s crawlers use the ETag.7
Google leaves it to the site to decide what counts as a change: according to the same post, updating the copyright year at the bottom of the page is probably not significant enough for a new ETag.6
Caching: Cache-Control, Expires, Age and CDNs
Cache-Control carries the caching directives. max-age sets the freshness lifetime in seconds, s-maxage overrides it for shared caches such as a CDN, no-cache allows storage but requires revalidation before each use, no-store forbids any storage, private keeps the response to the browser.8 web.dev keeps the one-year lifetime (max-age=31536000) for files whose URL changes with each version, such as a stylesheet with a fingerprinted name, and suggests no-cache for resources that must be revalidated before every use.9 An HTML page keeps its URL: caching it for a year risks returning visitors not seeing its updates. The tool flags it.
Expires gives an expiry date, and it is ignored as soon as Cache-Control contains max-age or s-maxage.10 Age gives how many seconds the copy has been held by an intermediate cache; a value of 0 usually means the response was just fetched from the origin server.11
CDNs and hosts add their own headers: cf-cache-status at Cloudflare, x-cache or x-cache-status elsewhere. At Cloudflare, HIT means the resource was in the cache, MISS that it was fetched from the origin, DYNAMIC that it was deemed not eligible for caching.12 The same site can answer MISS then HIT a few seconds apart: run the analysis again to watch the cache fill.
Compression
Content-Encoding says how the response body was compressed. MDN recommends compressing as much as possible, except for already compressed formats such as JPEG or ZIP, which compressing again can make larger.13 Google’s crawlers accept gzip, deflate and Brotli (br), and advertise what they can read in their Accept-Encoding header.7 The tool also asks for a compressed response: an HTML page that comes back without Content-Encoding is served uncompressed, which makes it heavier for visitors and crawlers alike.
Security headers
These headers tell the browser how to protect the people visiting the page. The OWASP Secure Headers Project maintains a reference configuration and the list of headers that became obsolete; the tool follows its recommendations.14
- Strict-Transport-Security (HSTS). Forces the browser to come back over HTTPS for max-age seconds. Sent over HTTP, it is ignored. To be accepted into browser preload lists, max-age must be at least one year, with includeSubDomains.15 OWASP suggests two years.14
- Content-Security-Policy (CSP). Limits the sources the page may load, which guards against cross-site scripting. The Report-Only variant reports violations without blocking anything: it is meant for testing.16
- X-Content-Type-Options. Its only value, nosniff, makes the browser follow the declared Content-Type and refuse a script or stylesheet served with the wrong type.17
- X-Frame-Options or frame-ancestors. Stop another site from embedding the page in a frame to hijack clicks. X-Frame-Options accepts DENY and SAMEORIGIN; with ALLOW-FROM, modern browsers ignore the whole header.18 The CSP frame-ancestors directive does the same job with more options.19
- Referrer-Policy. Controls how much of its address the page passes on to the sites it links to. Without this header, browsers apply strict-origin-when-cross-origin; unsafe-url sends the full address of HTTPS pages, even to HTTP sites.20
- Permissions-Policy. Allows or denies browser features such as the camera or geolocation to the page and its frames.21 Its predecessor, Feature-Policy, is obsolete.14
The tool also lists the cookies the page sets. Their value is never shown, only their attributes: Secure (sent over HTTPS only), HttpOnly (unreadable by page JavaScript) and SameSite, whose None value requires Secure.22 Finally, it flags X-XSS-Protection, which OWASP lists as obsolete and advises setting to 0, and the headers that reveal the server technology or version, such as X-Powered-By, which OWASP advises removing.14
What the tool sees, and what it does not
The request leaves from the nemociment.fr server, under a user-agent that presents it as a tool and not as Googlebot. A site that answers differently depending on the crawler, the country or a firewall may therefore send other headers to Google. Only the headers of the final response are analysed; intermediate redirects show up only through their status code. Rules set in the HTML, robots meta tag or canonical tag, are not read here.
Reading headers is part of the technical check of a website before working on its content: a noindex sent by the server is enough to take a page out of the results, whatever its content. On a whole site, with its page templates, files and server rules, this review is done template by template, and it is one of the first steps of the audit I run for my clients.
Frequently asked questions
What is the X-Robots-Tag header?
It is the equivalent of the robots meta tag, sent in the HTTP response. It accepts the same rules (noindex, nofollow, nosnippet...), can target a specific crawler and applies to any file type, PDFs and images included. Google only reads it if robots.txt lets it crawl the page.1
How do I see a page’s HTTP headers in Chrome?
Open the developer tools (F12), go to the Network tab, reload the page and click the first row: the response headers are in the Headers tab. This tool shows the same thing from a server, without your browser’s cookies or cache, and comments on what matters.
ETag or Last-Modified: which one for Googlebot?
Which Cache-Control value for an HTML page?
web.dev suggests no-cache for resources that must be revalidated before every use, and keeps max-age=31536000 for files whose URL changes with each version.9 An HTML page keeps its URL: no-cache, or a short max-age, together with an ETag, keeps it up to date without downloading it again on every visit.
Should I keep X-Frame-Options if the CSP has frame-ancestors?
Which security configuration does OWASP suggest?
Its reference configuration includes Strict-Transport-Security: max-age=63072000; includeSubDomains, X-Frame-Options: deny, X-Content-Type-Options: nosniff, Referrer-Policy: no-referrer and a starting Content-Security-Policy.14 A CSP has to be adapted to the site’s scripts; the Report-Only variant lets you try it without blocking anything.16
Sources
The passages of this page and the tool verdicts that rely on a source point to one of these references.
- Google, “Robots meta tag, data-nosnippet, and X-Robots-Tag specifications”, Google Search Central. developers.google.com ↑
- Google, “How to specify a canonical with rel="canonical" and other methods”, Google Search Central. developers.google.com ↑
- MDN, Content-Type header. developer.mozilla.org ↑
- MDN, Vary header. developer.mozilla.org ↑
- Google, “Mobile-first indexing best practices”, Google Search Central. developers.google.com ↑
- Gary Illyes, “Crawling December: HTTP caching”, Google Search Central Blog, December 9, 2024. developers.google.com ↑
- Google, overview of Google crawlers and fetchers (compression, HTTP caching). developers.google.com ↑
- MDN, Cache-Control header. developer.mozilla.org ↑
- web.dev, “Prevent unnecessary network requests with the HTTP Cache”. web.dev ↑
- MDN, Expires header. developer.mozilla.org ↑
- MDN, Age header. developer.mozilla.org ↑
- Cloudflare, “Cloudflare cache responses” (cf-cache-status values). developers.cloudflare.com ↑
- MDN, Content-Encoding header. developer.mozilla.org ↑
- OWASP Secure Headers Project: response headers, best practices and headers to remove. owasp.org ↑
- MDN, Strict-Transport-Security header. developer.mozilla.org ↑
- MDN, Content-Security-Policy header. developer.mozilla.org ↑
- MDN, X-Content-Type-Options header. developer.mozilla.org ↑
- MDN, X-Frame-Options header. developer.mozilla.org ↑
- MDN, CSP frame-ancestors directive. developer.mozilla.org ↑
- MDN, Referrer-Policy header. developer.mozilla.org ↑
- MDN, Permissions-Policy header. developer.mozilla.org ↑
- MDN, Set-Cookie header. developer.mozilla.org ↑