What does Google say about SEO? /
Quick SEO Quiz

Test your SEO knowledge in 5 questions

Less than a minute. Find out how much you really know about Google search.

🕒 ~1 min 🎯 5 questions

Official statement

Google does not index URLs with hashes separately. If the content you want indexed is loaded when you access the URL without the hash, then it is acceptable.
1:05
🎥 Source video

Extracted from a Google Search Central video

⏱ 1h00 💬 EN 📅 01/05/2018 ✂ 12 statements
Watch on YouTube (1:05) →
Other statements from this video 11
  1. 2:10 Faut-il vraiment un fallback statique pour les URLs générées en JavaScript ?
  2. 3:10 Googlebot attend-il vraiment le JavaScript avant d'indexer vos pages ?
  3. 5:50 Pourquoi vos nouvelles pages dansent-elles dans les SERPs pendant des semaines ?
  4. 13:08 Faut-il vraiment optimiser la longueur des méta-descriptions pour Google ?
  5. 16:45 Faut-il vraiment utiliser rel="next" et rel="prev" pour la pagination ?
  6. 21:30 Le contenu masqué derrière des onglets pénalise-t-il vraiment le SEO mobile ?
  7. 28:46 Faut-il vraiment inclure Googlebot dans vos tests A/B ou risquez-vous une pénalité SEO ?
  8. 29:22 Googlebot rate-t-il des pages entières à cause de la géolocalisation ?
  9. 33:34 Faut-il vraiment séparer contenu familial et non-familial par URL pour SafeSearch ?
  10. 35:05 Quelle métrique de vitesse Google privilégie-t-il vraiment pour le ranking ?
  11. 56:58 Les redirections 301 suffisent-elles vraiment à protéger votre visibilité après un changement d'URL ?
📅
Official statement from (8 years ago)
TL;DR

Google does not treat URLs with a hash (#) as distinct pages. If your content is already displayed when the URL is loaded initially without the hash, it will be indexed normally. However, if the hash triggers JavaScript to load different content, that content may not be considered for indexing.

What you need to understand

What does it really mean when we say 'Google does not index URLs with hashes separately'?

In URL syntax, the hash (or anchor) represents everything that follows the # symbol in a address. For example: https://example.com/page#section1. Historically, this fragment served for internal client-side navigation, without involving a server request.

Mueller states here that Google ignores the hash part during indexing. In other words, example.com/page and example.com/page#section1 are considered to be the same URL by the engine. This rule comes from how HTTP works: the hash is never sent to the server; it remains on the client side.

Why does Mueller's clarification raise questions among SEO practitioners?

Many modern sites use JavaScript frameworks (React, Angular, Vue) that rely on the hash for client-side routing. In these architectures, a hash change can load completely different content without refreshing the page.

The problem is: if this content does not exist in the initial HTML, Googlebot may never see it. Mueller bluntly states: content must be loaded with the URL without the hash. If your SPA loads a product page solely via #product-123, and the root URL displays a blank screen, you're facing an indexing issue.

What distinguishes this from pushState and modern URLs?

Smart developers have long migrated to the History API (pushState), which allows changing the visible URL without a hash and without reloading the page. This approach generates real distinct URLs, which Google normally indexes.

Mueller's statement implies that if you're still using hash routing in production, you're technologically behind. The hash was a practical hack before HTML5, but today it has no place in a modern SEO-friendly architecture.

  • Google completely ignores the part after # during indexing
  • The content to be indexed must be present in the initial HTML response of the URL without the hash
  • Hash routing (JavaScript navigation based on #) creates structural indexing issues
  • Modern frameworks should use the History API instead of hash URLs
  • This rule stems from the HTTP protocol: the hash is never sent to the server

SEO Expert opinion

Is this position consistent with real-world observations?

Yes, and it is one of the few assertions by Google where theory perfectly aligns with practice. All the tests I've conducted or witnessed within the SEO community confirm this behavior: Googlebot treats example.com/page#anchor exactly as example.com/page.

The important nuance is: Google can follow hash links to discover content on the same page, but it will never index these variations as distinct URLs. If you have 50 products loaded via different hashes on a single page, Google will see just one page with one set of content: that of the initial load.

Where are the pitfalls that Mueller doesn't mention?

Mueller is vague on a crucial point: how does Google determine that content is 'loaded'? Are we talking about raw HTML or what the JavaScript rendering engine detects after execution? [To be verified]

In my observations, Google does execute JavaScript, but with time and resource limitations. If your content takes 3 seconds to appear via JS after the initial load, it might be indexed... or not. This uncertainty creates a gray area that Mueller brushes aside.

Should we really worry about hash in modern SEO?

Honestly, if you're building a new site and considering hash routing, you're making the wrong decision. It is an outdated architecture for SEO. Period.

However, many legacy sites still have hash routing in production. For these, the solution is not cosmetic; you need to migrate to server-side rendering (SSR) or at minimum pre-rendering, with clean URLs. Any other approach is just a band-aid on a wooden leg.

Note: If you use hash URLs for tracking (UTM parameters in #), know that Google completely ignores them. For tracking, use query string parameters (?) or server-side solutions.

Practical impact and recommendations

How can you quickly audit if your site has a hash problem?

Open your browser in incognito mode, disable JavaScript (in DevTools: Cmd+Shift+P > 'Disable JavaScript'), and then navigate your site. Anything that disappears or fails to load presents an indexing risk.

Next, check your URLs in the Search Console. If you see variations with # in the coverage reports, it's an alarm signal: either you have poorly formed internal links, or your routing architecture creates polluted URLs.

What corrective actions should you take based on your situation?

If you're on a modern site (React, Vue, Angular), immediately migrate to React Router in browser mode or its equivalent, which generates real URLs. Configure your server to return the correct HTML page based on the requested URL, via SSR or pre-rendering.

For legacy sites that cannot be quickly revamped, implement dynamic rendering: serve pre-rendered HTML to Googlebot while keeping your SPA for human users. Google accepts this, but it is only a temporary solution.

Can we still use anchors # for internal navigation?

Absolutely, and it's even recommended for UX. The anchors to sections of a page (for example: #pricing-section) remain perfectly valid. Google understands them and can even display them in rich results.

The difference is: these anchors point to content already present in the HTML, not content loaded dynamically. This is the historical and legitimate use of the hash, for which it was designed. Use them freely for tables of contents, accordion FAQs, or scrolls to sections.

  • Audit your site with JavaScript disabled to identify content invisible to Googlebot
  • Migrate from hash routing to the History API (pushState) in your JS frameworks
  • Implement SSR or pre-rendering to serve complete HTML to Googlebot
  • Clean your internal links to remove unnecessary hash URLs
  • Keep the anchors # only for navigation to sections that exist in the HTML
  • Check in Search Console that no URL with a hash appears in your indexed pages
These technical optimizations touch the core of your front-end architecture and require advanced expertise in modern JavaScript, server rendering, and server configuration. If your internal team lacks skills in these critical areas, hiring a specialized technical SEO agency can help you avoid costly mistakes and significantly speed up the compliance of your indexing.

❓ Frequently Asked Questions

Google peut-il indexer du contenu qui n'apparaît que lorsqu'on clique sur un lien avec hash ?
Non. Google indexe l'URL sans tenir compte du hash, donc seul le contenu présent au chargement initial de cette URL sera pris en compte. Le contenu qui apparaît après interaction utilisateur sur une ancre hash ne sera pas indexé séparément.
Les paramètres UTM en hash (#utm_source=...) sont-ils trackés par Google Analytics mais ignorés par le SEO ?
Exact. Google Analytics côté client peut lire ces paramètres en JavaScript, mais Googlebot les ignore complètement pour l'indexation. Utilisez plutôt des paramètres query string (?) pour un tracking compatible SEO.
Quelle différence entre une URL avec hash et une URL avec paramètre query string pour Google ?
Fondamentale. Le hash (#) n'est jamais envoyé au serveur et est ignoré par Google pour l'indexation. Le query string (?) est transmis au serveur et Google peut indexer ces URLs comme distinctes, selon votre configuration de paramètres dans Search Console.
Si je migre de hash routing vers des vraies URLs, dois-je faire des redirections 301 ?
Techniquement impossible : vous ne pouvez pas rediriger côté serveur quelque chose qui n'est jamais envoyé au serveur. Implémentez plutôt une détection JavaScript côté client qui redirige les anciennes hash URLs vers les nouvelles URLs propres.
Les ancres de page (#section-2) nuisent-elles au SEO si utilisées dans les liens internes ?
Non, tant que le contenu de la section est présent dans le HTML initial. Ces ancres améliorent même l'UX et peuvent générer des sitelinks Google si bien structurées. C'est l'usage légitime du hash.
🏷 Related Topics
Content Crawl & Indexing AI & SEO Domain Name Pagination & Structure

🎥 From the same video 11

Other SEO insights extracted from this same Google Search Central video · duration 1h00 · published on 01/05/2018

🎥 Watch the full video on YouTube →

Related statements

💬 Comments (0)

Be the first to comment.

2000 characters remaining
🔔

Get real-time analysis of the latest Google SEO declarations

Be the first to know every time a new official Google statement drops — with full expert analysis.

No spam. Unsubscribe in one click.