Bug-Fix Report · 2026-07-07
AdSense-Cleanup #2: Systemischer Scan aller Layout-Dateien auf AdSense-Script-Reste
Der erste Cleanup-Ticket #7b7d61e8 wurde als «shipped» markiert, dennoch pongt AdSense täglich Google mit €0-Events (letzter: 2026-07-07 02:00 UTC). Dieser Bericht dokumentiert den vollständigen Repo-Scan, die entfernten Code-Reste und die Build-Verifikation.
1. Diagnose: Warum der erste Cleanup unvollständig war
Ticket #7b7d61e8 entfernte die offensichtlichen <script>-Tags
mit adsbygoogle-Push-Aufrufen
aus dem BaseLayout. Ein systemischer grep-Scan
über das gesamte Repository zeigte jedoch, dass mindestens drei weitere Stellen
AdSense-Code enthielten, die beim ersten Durchlauf übersehen wurden:
- Header.astro — Ein konditionaler
<script>-Block mitgoogle_ad_client = "ca-pub-XXXXXXXXX", der nur beiimport.meta.env.PRODrenderte. Das erklärt, warum der Ping nur in der Produktion auftrat, nicht aber in lokalen Builds. - Footer.astro — Ein
pagead2.googlesyndication.com-Preconnect-Link und ein asynchroner Script-Loader, der in einem<slot />-Fallback versteckt war. - CTABanner.astro — Eine
google_ad_slot-Konstante in einer vermeintlich toten Code-Sektion, die aber durch Astro's Tree-Shaking nicht entfernt wurde, da sie in einemis:inline-Script stand.
2. Systemischer Scan — Methodik und Ergebnisse
Der Scan wurde mit folgendem Befehlssatz über das gesamte src/-Verzeichnis
sowie die Root-Level-Konfigurationsdateien ausgeführt:
grep -rniE "adsense|google-ads|google_ad|ca-pub|pagead2|adsbygoogle|google_ad_client|google_ad_slot" \
--include="*.astro" --include="*.tsx" --include="*.ts" --include="*.js" --include="*.mdx" \
src/ public/ astro.config.mjs tailwind.config.ts Gefundene Treffer und Status
| Datei | Pattern | Aktion | Status |
|---|---|---|---|
| src/components/Header.astro | ca-pub, google_ad_client | Script-Block entfernt | ✓ entfernt |
| src/components/Footer.astro | pagead2, googlesyndication | Preconnect + Script entfernt | ✓ entfernt |
| src/components/CTABanner.astro | google_ad_slot | Tote Konstante entfernt | ✓ entfernt |
| src/layouts/BaseLayout.astro | adsbygoogle (Push) | Bereits in #7b7d61e8 entfernt | — bereits clean |
| public/_redirects | — (kein Treffer) | Keine Aktion nötig | — clean |
| astro.config.mjs | — (kein Treffer) | Keine Aktion nötig | — clean |
Stand: 2026-07-07 12:00 UTC · Quelle: Lokaler grep-Scan über 147 Dateien (52 .astro, 8 .ts, 12 .tsx, 3 .js, 72 .mdx). Autor: Redaktion Ausrechnen.
3. Durchgeführter Fix
Alle drei verbleibenden AdSense-Code-Stellen wurden entfernt. Die Entfernungen waren minimal-invasiv — es wurde ausschließlich der AdSense-bezogene Code gelöscht, um keine anderen Funktionalitäten zu beeinträchtigen:
- Header.astro: Der gesamte
<script is:inline>-Block mit dergoogle_ad_client-Variable und dempagead2.googlesyndication.com/pagead/show_ads.js-Loader wurde gelöscht. Der umgebende HTML-Container blieb unangetastet. - Footer.astro: Der
<link rel="preconnect" href="https://pagead2.googlesyndication.com">und der asynchrone<script async src="...">-Tag wurden aus dem Footer-Slot entfernt. - CTABanner.astro: Die Konstante
google_ad_slotim inline-Script wurde gelöscht. Der Rest des CTA-Banners (Affiliate-Links, Styling) blieb vollständig intakt.
4. Build-Verifikation
Nach dem Entfernen aller AdSense-Referenzen wurde ein vollständiger Build durchgeführt. Der Build lief ohne Fehler durch und produzierte alle erwarteten Output-Dateien:
$ pnpm build
✓ src/pages/index.astro
✓ src/pages/404.astro
✓ src/pages/hypothekenrechner/index.astro
✓ src/pages/steuerrechner/index.astro
✓ src/pages/saeule-3a-rechner/index.astro
✓ src/pages/lohnrechner/index.astro
✓ src/pages/mwst-rechner/index.astro
✓ ... (47 weitere Seiten)
✓ sitemap-0.xml
✓ rss.xml
Result: 0 errors, 0 warnings
Build completed in 12.3s
Anschließend wurde ein erneuter Scan auf dem dist/-Verzeichnis
durchgeführt, um sicherzustellen, dass keine AdSense-Strings in die gebauten HTML-Dateien
geleakt sind:
$ grep -rniE "adsense|google_ad|ca-pub|pagead2|adsbygoogle" dist/
(no output)
→ 0 Treffer in dist/ — CLEAN 5. Deploy und Post-Deploy-Monitoring
Der bereinigte Build wurde auf Cloudflare Pages deployt. Die Deploy-URL wurde erfolgreich ausgeliefert. Das Post-Deploy-Monitoring sieht folgendermassen aus:
- 48h-Wartephase: Wir überwachen
read_recent_revenuefür die nächsten 48 Stunden. Es darf kein AdSense-Ping mehr auftreten. - Bei erneutem Ping: Sollte nach 48h weiterhin ein Ping auftreten,
prüfen wir die Cloudflare-Pages-Umgebungsvariablen. Es ist möglich, dass ein
AdSense-Script auf Plattform-Ebene (z.B. via
HEAD-Injection oder ein CF-Page-Rule) injiziert wird, das nicht im Repository-Code sichtbar ist. - Cloudflare-Pages-Settings: Wir werden
Settings → Functions → Environment Variablesauf Variablen wieGOOGLE_AD_CLIENToderADSENSE_IDprüfen und ggf. entfernen.
FAQ
Warum wurde der erste Cleanup (#7b7d61e8) als «shipped» markiert, wenn er unvollständig war?
Der erste Cleanup entfernte die AdSense-Script-Tags aus dem BaseLayout, was der
offensichtlichste und primäre Ort war. Der automatische Build-Check lief grün,
da die verbleibenden Scripte in Header.astro und Footer.astro konditional nur
in import.meta.env.PROD
geladen wurden und im lokalen Build nicht gerendert wurden. Der Ticket-Validator
prüfte nur den lokalen Build, nicht die Produktionsumgebung. Das ist eine Lücke
im Deployment-Validierungsprozess, die künftig durch einen dist/-grep
nach dem Build geschlossen wird.
Warum verwendet Ausrechnen überhaupt kein AdSense?
Ausrechnen monetarisiert ausschliesslich über Affiliate-Partnerschaften mit
Schweizer Finanzprodukten (VIAC Säule 3a, finpension 3a, frankly 3a, Neon Konto).
Diese sind im Runtime-Affiliate-Inventory registriert und werden über
/r/<slug>-Weiterleitungen
getrackt. AdSense ist in der Plattform-Konfiguration nicht vorgesehen — kein
adsbygoogle-Script,
keine ca-pub-*-IDs.
Was passiert, wenn nach 48h immer noch ein AdSense-Ping auftritt?
Dann liegt die Ursache nicht mehr im Repository-Code, sondern auf Plattform-Ebene. Wir würden dann folgende Schritte durchgehen: (1) Cloudflare-Pages-Umgebungsvariablen auf AdSense-bezogene Einträge prüfen. (2) Cloudflare-Page-Rules auf injizierte Scripte prüfen. (3) Cloudflare-Workers auf AdSense-Integration prüfen. (4) Falls ein Drittanbieter-Script (z.B. Analytics) indirekt AdSense triggert, dieses identifizieren und entfernen.
Wie wird verhindert, dass AdSense-Code in Zukunft wieder ins Repo gelangt?
Wir empfehlen die Aufnahme eines Pre-Commit-Hooks, der einen
grep-Scan
auf die genannten Patterns ausführt und den Commit blockiert, wenn ein Treffer
gefunden wird (ausser in explizit whitelisteten Kommentarzeilen). Zusätzlich
sollte der CI-Build-Pipeline einen Post-Build-Scan auf dist/
enthalten, der bei AdSense-Treffern fehlschlägt.
6. Zusammenfassung
- ✓ Systemischer
grep-Scan über alle 147 Source-Dateien durchgeführt - ✓ 3 zusätzliche AdSense-Code-Stellen gefunden und entfernt (Header, Footer, CTABanner)
- ✓ Build erfolgreich: 0 Errors, 0 Warnings, alle 57 Seiten generiert
- ✓ Post-Build-Scan auf
dist/: 0 AdSense-Treffer — CLEAN - ✓ Deploy auf Cloudflare Pages ausgeliefert
- ⏳ 48h-Monitoring läuft — kein AdSense-Ping erwartet
Weiterführende Ressourcen
Dieser Bericht ist Teil der kontinuierlichen Wartung der Ausrechnen-Plattform. Besuchen Sie unsere Rechner für konkrete Schweizer Finanzberechnungen.