seo: én kanonisk URL-form — uden afsluttende skråstreg
Build & Deploy / deploy (push) Successful in 1m43s

Google kendte 41 af sitemapets 44 URL'er som "Webadressen er ikke kendt af
Google". Årsagen var at siden fandtes i to former: de interne links peger alle
på no-slash (/blog, /cv, /tags/proxmox), mens sitemap og <link rel="canonical">
brugte skråstreg-formen. Origin serverer begge med 200 uden redirect, så
Googles linkbaserede opdagelse ramte kun det ene sæt, og sitemapets sæt blev
aldrig opdaget.

Nu peger canonical, sitemap og RSS alle på no-slash-formen, som de interne
links i forvejen brugte. lastmod slås stadig op på Astros egne ruter (som har
skråstregen) FØR URL'en strippes, så sitemapets 44 lastmod-datoer er uændrede.

Claude-Session: https://claude.ai/code/session_0198n4owY35jQpwht1wCGzfh
This commit is contained in:
Asger Geel Weirsøe
2026-09-10 20:15:00 +02:00
parent 034e5e3312
commit fc7ca339a1
3 changed files with 13 additions and 2 deletions
+4
View File
@@ -145,6 +145,10 @@ export default defineConfig({
if (pathname === '/') item.priority = 1.0;
const lastmod = lastmodByRoute.get(pathname);
if (lastmod) item.lastmod = lastmod;
// Samme kanoniske form som <link rel="canonical"> og de interne links:
// uden afsluttende skråstreg. Slås lastmod op FØR strippet, fordi
// lastmodByRoute er nøglet på Astros egne ruter (som har skråstregen).
if (pathname !== '/') item.url = item.url.replace(/\/$/, '');
return item;
},
}),
+5 -1
View File
@@ -19,7 +19,11 @@ const {
const pageTitle = title ? `${title} · ${SITE.name}` : `${SITE.title} — Datalog & Technical Solution Architect`;
const desc = description ?? SITE.description;
const canonical = new URL(Astro.url.pathname, SITE.url).href;
// Kanonisk form er UDEN afsluttende skråstreg. Origin serverer begge former med
// 200, og de interne links peger alle på no-slash — så canonical og sitemap skal
// gøre det samme, ellers opdager Google to adskilte sæt af de samme sider.
const canonicalPath = Astro.url.pathname.replace(/\/$/, '') || '/';
const canonical = new URL(canonicalPath, SITE.url).href;
const ogImage = new URL(image ?? '/og.png', SITE.url).href;
const graphs = [baseGraph, ...jsonLd];
---
+4 -1
View File
@@ -9,11 +9,14 @@ export async function GET(context) {
title: SITE.title,
description: SITE.description,
site: context.site,
// Samme kanoniske URL-form som canonical og sitemap: uden afsluttende
// skråstreg. @astrojs/rss tilføjer den ellers selv (default true).
trailingSlash: false,
items: posts.map((p) => ({
title: p.data.title,
description: p.data.description,
pubDate: p.data.date,
link: `/blog/${p.id}/`,
link: `/blog/${p.id}`,
})),
customData: `<language>da-dk</language>`,
});