glimanaDocs Open Glimana →

Issue guide · Indexability

Links use URL fragments (#/ or #!) to change content

SeverityMedium
CategoryIndexability
ScopePer page
EffortLarge
Verified byRe-crawl after you mark the task done
Rule keyfragment_routing_links

Short answer

Links on the page look like #/products/42 or #!about. Google generally ignores everything after #, so those views are not crawled as pages of their own. Use real paths (/products/42) with the History API and link to them.

Why it matters

Fragments were designed to jump within a page, not to name different pages. Hash-based routing (common in older single-page apps) makes every view share one URL in Google's eyes; only the first view can rank, and the others cannot be linked to or shown in results. The old #! "AJAX crawling scheme" was deprecated years ago and is no longer supported.

How Glimana detects it

The crawler counts internal links whose target path differs only by a fragment starting with / or !. The rule fires when such links exist on a 200 HTML page; the evidence shows the count.

How to fix it

Switch the router to history mode so each view has its own path, make the server return the application for those paths (or render them server-side), and update internal links. This is an L-effort change in the application, not a template tweak.

Rare; appears with page-builder "tabs" or "one-page" themes that use #! for sections. Replace with real pages, or accept that sections share the page's URL.

Appears in some product-filter apps. Prefer apps that use query parameters (?filter=) or real collection URLs.

Vue Router createWebHistory(), React Router BrowserRouter, Angular PathLocationStrategy. Add server-side rendering or prerendering for the routes you want indexed.

How the fix is verified

Re-crawl; the task closes when the page no longer links with routing fragments.

Sources