Skip to content

Strengthen person entity signals and fix canonical URL redirects - #55

Merged
dinooo13 merged 2 commits into
mainfrom
seo/person-entity-and-canonical-urls
Sep 30, 2026
Merged

dinooo13 merged 2 commits into
mainfrom
seo/person-entity-and-canonical-urls

Conversation

@dinooo13

Copy link
Copy Markdown
Owner

Why

Search Console (domain property) shows the site is barely indexed, and the cause is on our side:

  • The sitemap, every canonical tag and every internal link used slash-less URLs (/labs), but the host serves directory indexes and 301-redirects them to /labs/. Google indexed the slash form of three pages, each declaring a canonical that redirects back, and had never crawled six of the nine content pages.
  • The homepage was last crawled on 20 August, so Google still describes the eventim role.
  • The old Hugo category and tag pages still collect impressions.
  • The sitemap's discovered image URL was double-escaped and returned 404.

What changed

Canonical URLs use the trailing-slash form everywhere. site.trailingSlash is on, app.vue normalises the canonical, and the path helpers, nav links, homepage buttons, detail-page back links, 404/410 pages, breadcrumbs, detail-page canonicals, llms.txt, llms-full.txt and rss.xml all agree. Nothing the site advertises points at a redirect any more. RSS item GUIDs change with the URLs, so feed readers may show existing items once as new.

Person schema carries disambiguation signals. The shared #identity node now has givenName/familyName, alternateName (GitHub handle), homeLocation Bremen with postal address, nationality, worksFor.url, knowsAbout (four topics linked to Wikipedia entities), sameAs extended with the Rheinwerk speaker entry, the Rheinwerk course page and the agentic.hamburg speaker spotlight, plus subjectOf for that article and email. The hero shows "Bremen, Germany" under the role line, driven by a new optional hero.location content field.

htaccess. 410 for the whole legacy Hugo URL space (/p/, /page/, /categories/, /archives/, /search/, /about/, plus the existing /tags/, /en/, /legal), verified against the old Hugo config in git history. HTML, XML and TXT files get Cache-Control: no-cache so visitors and feed readers revalidate instead of holding the host's one-year cached copy; hashed assets keep the long cache.

Sitemap image. Image discovery is off and the portrait is declared explicitly for / with the same URL the Person schema uses.

Verification

  • pnpm lint, pnpm typecheck pass; pnpm generate completes with the link checker at 0 errors / 0 warnings.
  • Generated output checked: canonicals, og:url, sitemap entries (per-page lastmod preserved, error routes excluded), breadcrumbs, ItemList and Event URLs, llms.txt and rss.xml all use the slash form; no slash-less internal href remains in any page.
  • Served the build and drove it in a browser: navigation stays client-side, header active state and aria-current are right on each route, canonicals update on navigation.

After deploy

  • Check the homepage response headers: the cache-control change only takes effect on the Apache host. If the host injects its own header at the nginx layer both will appear and browsers honour no-cache.
  • In Search Console, request indexing for /, /labs/ and /speaking/, and resubmit the sitemap.

🤖 Generated with Claude Code

Search Console showed that every sitemap entry, canonical tag and
internal link used slash-less URLs while the host serves directory
indexes and 301-redirects /labs to /labs/. Google had indexed the slash
form of three pages and never crawled six of the nine content pages.

- Make the trailing-slash form canonical site-wide: site.trailingSlash,
  canonical normalisation in app.vue, path helpers, nav and back links,
  breadcrumbs, detail-page canonicals, error pages, llms.txt and rss.xml.
- Extend the schema.org Person identity with name parts, handle, city,
  nationality, employer URL, topics, third-party profile pages and the
  speaker spotlight article, and show the city in the hero.
- Return 410 for the whole legacy Hugo URL space (/p/, /page/,
  /categories/, /archives/, /search/, /about/) and stop the host's
  one-year cache on HTML, XML and TXT files.
- Declare the portrait explicitly in the sitemap instead of the
  double-escaped ipx thumbnail that image discovery produced.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The absolute site URL skipped the /pr-<n>/ base path on preview builds,
so the declared image pointed at a missing file there. A relative loc
lets the sitemap module resolve it per environment; production output
is unchanged.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@dinooo13
dinooo13 merged commit 4792ab8 into main Sep 30, 2026
8 checks passed
@dinooo13
dinooo13 deleted the seo/person-entity-and-canonical-urls branch September 30, 2026 19:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant