From e0f0ae7c7ff743a796946fd1b3555e3700873d06 Mon Sep 17 00:00:00 2001 From: andwati Date: Wed, 7 Oct 2026 11:20:31 +0300 Subject: [PATCH] Fix GA measurement ID and CSP, redirect legacy Hugo URLs Use the GA4 measurement ID Search Console expects and allow Google Tag Manager/Analytics in the CSP so gtag is not blocked. Add 301s from the old /posts, /writings, /tags, /archive, /about and /index.xml URLs to their current routes to clear the Search Console 404s. --- src/app/layout.tsx | 2 +- sws.toml | 59 +++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 6ffba0a..6a4ad67 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -59,7 +59,7 @@ const websiteLd = { }; const isProd = process.env.NODE_ENV === "production"; -const gaId = "G-9XLTKZF07C"; +const gaId = "G-4HGRQ9QNPD"; const umamiScript = process.env.PUBLIC_UMAMI_SCRIPT_URL; const umamiId = process.env.PUBLIC_UMAMI_WEBSITE_ID; diff --git a/sws.toml b/sws.toml index 9cbb167..b825a26 100644 --- a/sws.toml +++ b/sws.toml @@ -7,10 +7,67 @@ ignore-hidden-files = false [advanced] +# Legacy Hugo URLs (/posts, /writings, /tags, ...) -> current routes. First match wins, +# so the trailing-slash variants Google crawled come before the bare ones. +[[advanced.redirects]] +source = "/posts/page/{*}/" +destination = "/writing" +kind = 301 + +[[advanced.redirects]] +source = "/posts/page/{*}" +destination = "/writing" +kind = 301 + +[[advanced.redirects]] +source = "/{posts,writings,tags,archive}/" +destination = "/writing" +kind = 301 + +[[advanced.redirects]] +source = "/{posts,writings}/{*}/" +destination = "/writing/$2" +kind = 301 + +[[advanced.redirects]] +source = "/{posts,writings}/{*}" +destination = "/writing/$2" +kind = 301 + +[[advanced.redirects]] +source = "/{posts,writings,tags,archive}" +destination = "/writing" +kind = 301 + +[[advanced.redirects]] +source = "/tags/{*}/" +destination = "/writing" +kind = 301 + +[[advanced.redirects]] +source = "/tags/{*}" +destination = "/writing" +kind = 301 + +[[advanced.redirects]] +source = "/about/" +destination = "/" +kind = 301 + +[[advanced.redirects]] +source = "/about" +destination = "/" +kind = 301 + +[[advanced.redirects]] +source = "/index.xml" +destination = "/rss.xml" +kind = 301 + [[advanced.headers]] source = "**" [advanced.headers.headers] -Content-Security-Policy = "default-src 'self'; script-src 'self' 'unsafe-inline' https://utteranc.es https://analytics.andwati.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; connect-src 'self' https://analytics.andwati.com; frame-src https://www.youtube-nocookie.com https://utteranc.es; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'none'; upgrade-insecure-requests" +Content-Security-Policy = "default-src 'self'; script-src 'self' 'unsafe-inline' https://utteranc.es https://analytics.andwati.com https://www.googletagmanager.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https://www.google-analytics.com https://www.googletagmanager.com; font-src 'self'; connect-src 'self' https://analytics.andwati.com https://www.google-analytics.com https://*.google-analytics.com https://*.analytics.google.com https://www.googletagmanager.com; frame-src https://www.youtube-nocookie.com https://utteranc.es; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'none'; upgrade-insecure-requests" X-Frame-Options = "DENY" X-Content-Type-Options = "nosniff" Referrer-Policy = "strict-origin-when-cross-origin"