Skip to header Skip to main navigation Skip to main content Skip to footer

Main navigation

  • Home
  • Drupal Theming
  • Web Designer In Austin
  • Drupal Development Portfolio (opens in new tab)
  • Blog
  • Videos
  • Contact
Web Designer In Austin
Designing Drupal, Defining Distinction

Free SEO Tools on Drupal: What Each One Cannot See

Alaa Haddad, professional Drupal developer based in Austin, TX   Drupal Care
  12:16 AM CDT, Wed September 16, 2026
Share

Every free SEO tool reads the page your theme rendered, never the field you typed into — and on a Drupal site those two documents are so different that most confusing tool reports are explained by the gap alone. The tools are still worth using. They are worth using with a clear idea of where each one stops.

Here is the gap, measured on this very page rather than described. The body field stored for this article contained zero second-level headings. The page a tool downloads from the same URL contains thirteen, plus thirteen third-level headings that no author wrote.

Where the extra headings come from

Fetching the article and listing its headings in document order returns one h1 — the title — and then a list that includes Breadcrumbs, Breadcrumb, Main page content, Search, several menu names and Footer menu. None is content. They are block labels and navigation landmarks added by the theme and by core.

Some of them are invisible on screen and still present in the markup, which is deliberate and not a bug: a navigation region needs a heading so that a screen-reader user can jump to it or skip past it. The mechanics of which block types keep a hidden heading and which drop it entirely are set out in what Drupal really renders for a hidden block title.

The practical effect is that an extension reporting your heading structure is wrong may be describing your sidebar. Before rewriting an article's headings, find out whether the tool was reading the article at all.

Links behave the same way. The same fetch returned 173 anchors, of which 151 point inside the site — but only 54 sit inside the <article> element. A crawler weighing links in content differently from links in navigation is looking at a much smaller set than the total any tool reports.

What each free tool can honestly tell you

Free tools against a Drupal front end: the reach of each, and the blind spot
ToolWhat it readsWhat it cannot see on a Drupal site
Google Search ConsoleGoogle's own index and crawl of your verified propertyAnything behind a login, and any host you did not verify as a separate property
Bing Webmaster ToolsThe same idea for Bing's indexSame boundaries; the two indexes disagree, which is informative rather than a fault
PageSpeed Insights / LighthouseOne anonymous request to one URLThe logged-in experience, which skips the anonymous page cache entirely
Browser extensions (MozBar, SEOquake)The rendered DOM after your theme and every block has runWhich headings and links came from content rather than from regions
curl and view-sourceExactly the bytes the server sent, headers includedNothing that a crawler sees; this is the honest instrument

Search Console: pick the right property first

Requesting the www form of this site's article URL returns 301 with a Location pointing at the bare domain. A property registered on the redirecting host therefore reports almost nothing, and it looks like a traffic collapse rather than a configuration choice. Verify the host that actually serves 200 — or use a Domain property, which covers both — before drawing any conclusion from an empty report.

Speed tools measure a cached page, and not yours

Two requests to the same article, thirty seconds apart, both came back with X-Drupal-Cache: HIT and Cache-Control: max-age=3600, public. The first of those header names is a constant in core: core/modules/page_cache/src/StackMiddleware/PageCache.php line 25, from the module core calls Internal Page Cache, which serves anonymous visitors a stored response without rebuilding the page. Its sibling X-Drupal-Dynamic-Cache is defined at core/modules/dynamic_page_cache/src/EventSubscriber/DynamicPageCacheSubscriber.php line 41.

So a free speed tool is grading a response that was assembled earlier and handed over ready-made. That is the right thing to measure, because it is what a visitor gets. It is the wrong thing to quote at an editor who says the site feels slow, because an editor is logged in, misses that cache by design, and carries the toolbar and contextual links as well.

Two more things were visible in those headers and neither is guessable from the outside: the response carried Vary: Cookie, and Cloudflare reported cf-cache-status: DYNAMIC on the HTML — the page was answered by the origin, not from the edge. A caching plan that assumes otherwise is the sort of thing worth settling deliberately, and how Drupal and Cloudflare caching fit together covers that decision.

The sitemap's own header confuses crawl tools

The sitemap URL is served with X-Robots-Tag: noindex, follow. That is hardcoded by the sitemap module rather than chosen by the site, so a crawler add-on flagging sitemap is set to noindex has found a deliberate header and not a mistake.

Four checks worth running yourself

None of these needs an account, and each answers a question the dashboards answer slowly:

curl -sI https://example.com/some-page            # status, cache and Vary headers
curl -s  https://example.com/some-page | grep -i '<title>\|name="description"'
curl -sI https://example.com/node/123            # does the numeric path redirect?
curl -s  https://example.com/sitemap.xml | grep -c '<url>'

The third one is the most revealing on a Drupal site. If the internal node path returns 200 instead of a redirect, the same content is reachable at two addresses and you have a duplication question to settle. If a numeric path redirects, you can tell from the response headers alone which module did it.

If the output of those four commands does not match what a dashboard is telling you, the commands are right — and that is usually the moment to get a Drupal themer to look at what the front end is emitting, because the difference is almost always in the theme layer.

Common questions

Which free tool should I start with?
Search Console, because it is the only one reading the index you care about. Everything else is a second opinion about a page you can fetch yourself.
Why does an extension report headings I did not write?
Because it reads the finished document, and blocks, menus and breadcrumbs contribute headings to it. Compare against the body field before changing anything.
Are paid tools better?
For competitor and keyword research, generally yes. For what your own site emits, no — the server's own response is free and definitive.
My speed score is good and the site feels slow. Who is wrong?
Neither. The score measured an anonymous cached page; the feeling is probably an editor's logged-in session, which misses that cache by design.
Can these tools see content behind a login?
No. Nothing in this list authenticates, so a members' area is invisible to all of them and to search engines as well.

Next steps

The companion pages take the other two halves of this subject: which modules emit the tags these tools read, and why a third-party authority score is not a Drupal setting.

These measurements were taken by Alaa Haddad, who has worked in web development since 2005 and is the author of Drupal modules and themes — all public on the drupal.org profile. If a tool is telling you something about your Drupal site that you cannot reproduce with curl, send the URL and the report: request a quote and say what the tool claims, and you will get a straight answer about which layer is lying.

Search Engine Performance

Footer menu

  • About
  • Privacy Policy
  • Terms & Conditions
  • Flash Web Center, LLC (opens in new tab)
  • Drupal Care (opens in new tab)
  • Log in
  • Contact

Copyright © 2026 Flash Web Center, LLC | All rights reserved

Developed & Designed by Alaa Haddad