Design wechseln

Templategenerierte Seiten: Technische Umsetzungswege für Programmatic SEO

Easton editorial illustration: SEO-to-publishing automation line

Letzte Woche sprach mich ein Freund zum Thema Programmatic SEO an. Sein Keyword-Matrix stand – über zweitausend Long-Tail-Keywords ordentlich in Excel. Beim nächsten Schritt blieb er hängen.

„Ich verstehe die Logik, aber beim Umsetzen kommen hundert Fragen. Next.js oder Astro? Welche Datenbank? Wie sieht die URL-Struktur aus? Und: Halten fünftausend Seiten auf einmal erzeugt der Server überhaupt aus?“

Diese Fragen hatte ich vor zwei Jahren selbst. Damals baute ich ein Anwaltsverzeichnis mit dreitausend Stadtseiten per Programmatic SEO. Ergebnis: zwei Monate bis zur ersten Version – die Fehler von damals tun heute noch weh.

Dieser Artikel füllt genau diese Lücken. Drei vollständige technische Wege: statische Generierung, dynamisches Rendering, Hybrid. Jeder mit Code-Ideen, Einsatzszenarien und echten Beispielen. Danach können Sie loslegen – ohne den Umweg, den ich damals ging.


Zuerst klären: Welcher Weg passt zu Ihnen?

Technische Umsetzung ist kein blindes Framework-Roulette. Zuerst die Daten betrachten.

Passt statische Generierung (SSG) zu Ihnen?

Wenn sich Ihre Daten selten ändern – einmal pro Woche oder sogar monatlich – ist statische Generierung am stabilsten.

Beispiel: Ich half einem Bekannten bei einem Reiseführer-Projekt. Pro Stadt waren Inhalte weitgehend fix – Sehenswürdigkeiten, Verkehr, Gastronomie. Updates etwa halbjährlich. Mit Astros Content Collections speicherten wir zweitausend Städte als JSON und generierten statische Seiten im Batch. Build etwa zehn Minuten, danach TTFB (Time to First Byte) stabil um 80 ms, CDN-Cache-Hit-Rate 95 %.

Vorteile: schnelle Ladezeiten, SEO-freundlich, geringe Serverlast.Nachteile: bei Datenänderung Full Rebuild – ab fünftausend Seiten wird der Build lang.

Wann dynamisches Rendering (SSR)?

Bei Echtzeitdaten scheitert statische Generierung.

Wise (Geldtransfer) ist ein klassisches Beispiel. Wechselkursseiten ändern sich minütlich. Bei SSG sähen Nutzer Kurse von vor zehn Minuten – für Transferentscheidungen inakzeptabel. Wise nutzt Next.js SSR und holt bei jedem Request frische Kurse von der API.

Der Preis: Serverlast. Millionen Währungsabfragen täglich – nicht billig. TTFB liegt typischerweise bei 200–500 ms.

Hybrid als Mittelweg

Mischung aus selten und häufig aktualisierten Daten? Hybrid passt oft am besten.

Zapier macht das bei Integrationsseiten. Über fünftausend Seiten wie „Slack und Gmail integrieren“. Basisinfos (Funktionen, Setup) sind statisch; Nutzerstatus (verbunden, letzte Sync) ist dynamisch.

Zapier nutzt Next.js ISR (Incremental Static Regeneration). Erster Load statisch, im Hintergrund periodisches Update. Schnell und aktuell zugleich.

Mein Rat: Beantworten Sie drei Fragen, dann wählen Sie den technischen Weg.

  1. Wie oft ändern sich die Daten? (täglich? stündlich? Echtzeit?)
  2. Wie groß ist die Seitenmenge? (unter 5.000? 5.000–20.000? darüber?)
  3. Wie hoch sind die SEO-Performance-Anforderungen? (TTFB unter 100 ms nötig? oder 300 ms ok?)

Damit wird die Technologiewahl klar.

<100ms
Statische Generierung TTFB
CDN-Cache-Hit
200-500ms
Dynamisches Rendering TTFB
Serverseitige Generierung
Kompromiss
ISR-Ansatz
Balance aus Performance und Aktualität
Source: Technischer Kennzahlenvergleich

Statische Generierung: Astro in der Praxis

Entscheiden Sie sich für SSG, empfehle ich Astro. Astro ist für statische Sites gebaut; Content Collections passen hervorragend zu Programmatic SEO.

Datenstruktur

Zuerst das Schema. Beispiel Anwaltsverzeichnis – eine Seite pro Stadt:

// src/content/config.ts
import { defineCollection, z } from 'astro:content';

const lawyersCollection = defineCollection({
  type: 'content',
  schema: z.object({
    city: z.string(),
    citySlug: z.string(),
    province: z.string(),
    lawyerCount: z.number(),
    topFirms: z.array(z.string()),
    avgPrice: z.string(),
    specialties: z.array(z.string()),
  }),
});

export const collections = {
  'lawyers': lawyersCollection,
};

Unter src/content/lawyers/ legen Sie pro Stadt eine JSON-Datei an:

// src/content/lawyers/beijing.json
{
  "city": "北京",
  "citySlug": "beijing",
  "province": "北京市",
  "lawyerCount": 12500,
  "topFirms": ["金杜律师事务所", "中伦律师事务所", "大成律师事务所"],
  "avgPrice": "2000-5000元/小时",
  "specialties": ["刑事", "民事", "商事", "知识产权"]
}

Zweitausend Städte, zweitausend JSON-Dateien. Mit Python oder Node.js exportieren Sie aus der Datenbank und schreiben die Dateien im Batch.

Dynamisches Routing-Template

Daten stehen – als Nächstes das Template. Astros dynamische Routen sind flexibel:

// src/pages/[citySlug].astro
---
import { getCollection } from 'astro:content';

export async function getStaticPaths() {
  const lawyers = await getCollection('lawyers');
  return lawyers.map(lawyer => ({
    params: { citySlug: lawyer.data.citySlug },
    props: { lawyer },
  }));
}

const { lawyer } = Astro.props;
---

<!DOCTYPE html>
<html>
<head>
  <title>{lawyer.data.city} Anwaltsdienstleistungen – Leitfaden | Kanzleien & Honorare</title>
  <meta name="description" content={`Vollständiger Anwaltsleitfaden für ${lawyer.data.city}, Bereiche ${lawyer.data.specialties.join('、')}, Top-Kanzleien ${lawyer.data.topFirms.join('、')}, durchschnittliche Honorare ${lawyer.data.avgPrice}`} />
</head>
<body>
  <h1>{lawyer.data.city} – Anwaltsdienstleistungen</h1>

  <section>
    <h2>Kerndaten</h2>
    <p>Anzahl Anwälte: {lawyer.data.lawyerCount}</p>
    <p>Schwerpunkte: {lawyer.data.specialties.join('、')}</p>
    <p>Durchschnittliche Honorare: {lawyer.data.avgPrice}</p>
  </section>

  <section>
    <h2>Empfohlene Kanzleien</h2>
    <ul>
      {lawyer.data.topFirms.map(firm => <li>{firm}</li>)}
    </ul>
  </section>

  <!-- Interne Links: Nachbarstädte -->
  <section>
    <h2>Anwaltsdienstleistungen in der Region</h2>
    <!-- Empfehlung nach Provinz oder Geografie -->
  </section>
</body>
</html>

getStaticPaths erzeugt automatisch alle Stadtseiten – zweitausend Städte, zweitausend HTML-Dateien.

Build und Deployment

npm run build

Unter dist/ liegen alle statischen HTML-Dateien. Deployment auf Cloudflare Pages oder Vercel – CDN cached automatisch.

Mein Reiseführer-Projekt: zweitausend Seiten, Build etwa zehn Minuten. Astro ist beim statischen Build oft schneller als Next.js.

Optimierung: Ab fünftausend Seiten Batch-Builds nutzen. Astro unterstützt inkrementelle Builds – nur neue Daten neu generieren, nicht die ganze Site.


Dynamisches Rendering: Next.js SSR in der Praxis

Bei Echtzeitdaten hilft Next.js SSR.

Basis-Konfiguration

Kernstück ist getServerSideProps:

// pages/currency/[pair].tsx
import { GetServerSideProps } from 'next';

export const getServerSideProps: GetServerSideProps = async (context) => {
  const { pair } = context.params;
  const [from, to] = pair.split('-to-');

  // Echtzeit-Wechselkurs
  const exchangeRate = await fetchExchangeRate(from, to);

  return {
    props: {
      from,
      to,
      rate: exchangeRate.rate,
      lastUpdate: exchangeRate.timestamp,
    },
  };
};

export default function CurrencyPage({ from, to, rate, lastUpdate }) {
  return (
    <div>
      <h1>{from} to {to} Währungsumrechnung</h1>
      <p>Aktueller Kurs: {rate}</p>
      <p>Aktualisiert: {new Date(lastUpdate).toLocaleString()}</p>

      {/* Umrechner */}
      <input type="number" placeholder="Betrag eingeben" />
      <button>Umrechnen</button>

      {/* Verlaufschart */}
      <div>Kursverlauf der letzten 30 Tage</div>
    </div>
  );
}

Jeder Aufruf von /currency/usd-to-eur holt frische Kursdaten – Inhalte bleiben aktuell.

Cache-Strategie: Server nicht überlasten

SSR erzeugt Last. Millionen Abfragen täglich ohne Cache wären teuer.

stale-while-revalidate hilft: zuerst gecachte (evtl. leicht veraltete) Daten ausliefern, im Hintergrund aktualisieren.

export const getServerSideProps: GetServerSideProps = async (context) => {
  const { pair } = context.params;

  const cached = await checkCache(pair);

  if (cached && !isExpired(cached)) {
    return { props: cached.data };
  }

  fetchExchangeRate(pair).then(data => updateCache(pair, data));

  return { props: cached?.data || await fetchExchangeRate(pair) };
};

Nutzer sehen schnell Inhalte; externe APIs werden nicht bei jedem Request aufgerufen.

Dynamisches Structured Data

Auch JSON-LD muss dynamisch sein:

const jsonLd = {
  "@context": "https://schema.org",
  "@type": "FinancialService",
  "name": `${from} to ${to} Currency Conversion`,
  "offers": {
    "@type": "Offer",
    "price": rate,
    "priceCurrency": to,
  },
};

<script type="application/ld+json">
  {JSON.stringify(jsonLd)}
</script>

Pro Seite aktuelles Schema – Google kann frische Kurse in den SERPs anzeigen.


Hybrid: Next.js ISR in der Praxis

Teils statisch, teils dynamisch? ISR (Incremental Static Regeneration) ist oft die beste Wahl.

ISR-Logik

Seite wird zunächst statisch erzeugt, mit Ablaufzeit. Nach Ablauf triggert der nächste Besuch eine Hintergrund-Regenerierung.

// pages/integrations/[app1]-and-[app2].tsx
export async function getStaticPaths() {
  const integrations = await fetchAllIntegrations();
  return integrations.map(int => ({
    params: { app1: int.app1, app2: int.app2 },
  }));
}

export async function getStaticProps({ params }) {
  const integration = await fetchIntegration(params.app1, params.app2);

  return {
    props: integration,
    revalidate: 3600, // Ablauf nach 1 Stunde
  };
}

revalidate: 3600: eine Stunde lang statische Antworten; danach sieht der erste Besuch noch die alte Version, im Hintergrund entsteht die neue – ab dem zweiten Besuch ist sie live.

On-Demand-Revalidation

Manchmal soll sofort aktualisiert werden – z. B. wenn eine Zapier-Integration ausfällt.

// pages/api/revalidate.ts
export default async function handler(req, res) {
  const { app1, app2 } = req.query;

  try {
    await res.revalidate(`/integrations/${app1}-and-${app2}`);
    return res.json({ revalidated: true });
  } catch (err) {
    return res.status(500).send('Error revalidating');
  }
}

Monitoring kann Integrationsstatus prüfen und diese API bei Problemen aufrufen.

Grenzen von ISR

Bei wirklich Echtzeit-Anforderungen (Aktienkurse, Flash-Sales) bleibt SSR nötig.

ISR passt, wenn Updates stündlich oder täglich reichen, aber schnell sichtbar sein sollen – wie bei Zapier-Integrationsseiten.


URL-Struktur: SEO-Fundament

Technologie steht – als Nächstes URLs. Oft unterschätzt, direkt relevant für Rankings.

Drei Prinzipien SEO-freundlicher URLs

Erstens: Zielkeywords in der URL. Google wertet Pfade mit – natürlich eingebettete Keywords helfen.

Seite „Scheidungsanwalt Peking“: /beijing/divorce-lawyer – „beijing“ und „divorce-lawyer“ im Pfad.

Zweitens: maximal drei Ebenen. Tiefer verwirrt Nutzer und Crawler.

/service/legal/lawyer/divorce/beijing mit sechs Ebenen wirkt schnell minderwertig.

Drittens: Bindestriche, keine Query-Parameter.

/lawyer?type=divorce&city=beijing schlägt /beijing/divorce-lawyer – Parameter-URLs wirken oft dynamisch und indexieren schlechter.

Drei gängige URL-Muster

Muster 1: Kernkeyword vorne

/lawyer/beijing/divorce

Markenorientierte Sites – „lawyer“ vorne.

Muster 2: Geo vorne

/beijing/divorce-lawyer

Lokale Dienste – passt zu „Stadt + Service“-Suchen.

Muster 3: Flach

/beijing-divorce-lawyer

Sehr viele Seiten – eine Ebene, einfaches Management.

Orientieren Sie sich an der Suchintention Ihrer Nutzer. Dominieren „Stadt + Service“-Queries, Muster 2. Bei verteilten Keywords eher Muster 3.

Interne Verlinkung automatisieren

Stärke von Programmatic SEO: automatisches Link-Netz.

Dreitausend Stadtseiten im Anwaltsverzeichnis – jede sollte verwandte Städte verlinken.

Geografisch: Peking verlinkt „Anwälte Hebei“, „Anwälte Tianjin“.

Nach Service: Peking-Scheidungsanwalt verlinkt „Strafrecht Peking“, „Zivilrecht Peking“.

Code-Beispiel:

---
const { lawyer } = Astro.props;
const nearbyCities = await getNearbyCities(lawyer.data.province);
const relatedSpecialties = lawyer.data.specialties;
---

<section>
  <h2>Anwälte in der Region</h2>
  {nearbyCities.map(city => (
    <a href={`/${city.slug}/${lawyer.data.specialties[0]}-lawyer`}>
      {city.name} – {lawyer.data.specialties[0]} Anwalt
    </a>
  ))}
</section>

<section>
  <h2>Weitere Rechtsgebiete in {lawyer.data.city}</h2>
  {relatedSpecialties.map(spec => (
    <a href={`/${lawyer.data.citySlug}/${spec}-lawyer`}>
      {lawyer.data.city} – {spec} Anwalt
    </a>
  ))}
</section>

Dutzende interne Links pro Seite – Netz für Crawler, Navigation für Nutzer.


Datenbankwahl: Nicht zu lange grübeln

Datenmodell steht – wo speichern? Vier Optionen, klar getrennt:

PostgreSQL: feste Struktur, komplexe Queries.

Feste Felder und Abfragen wie „alle Scheidungsanwälte in Peking unter 3000 Yuan/Stunde“ – PostgreSQL mit ACID, Transaktionen, Volltextsuche.

MongoDB: flexible Struktur, schnelle Iteration.

Schema noch in Bewegung? MongoDB ohne starres Schema – frühe Projekte oft praktisch.

Airtable/Google Sheets: kleine Datenmengen, Teamarbeit.

Bis wenige hundert Zeilen, mehrere Bearbeiter – visuell, ohne SQL. Bekannter Fall: zweihundert Einträge in Airtable, minimaler Pflegeaufwand.

CSV/JSON: reine SSG-Szenarien.

Vollständig statische Daten, unter tausend Seiten – Dateien reichen. Astros Content Collections sind genau dafür gedacht.

Empfehlung nach Datenvolumen

Unter 1.000 Einträge: CSV/JSON oder Airtable.
1.000–10.000: PostgreSQL oder MongoDB.
Über 10.000: PostgreSQL + Redis-Cache.

Nicht ewig debattieren – Migration später ist machbar.


Template-Entwicklung: Content-Differenzierung

Architektur steht – Templates entscheiden über Erfolg. Viele Projekte scheitern an identischen Inhalten.

Falle: Nur Keywords tauschen

Ein Projekt: zwanzigtausend „Stadt + Hotel“-Seiten, nur der Stadtname wechselte. Google-Strafe, Traffic minus 70 %, acht Monate Recovery.

Ursache: kein einzigartiger Mehrwert pro Seite.

Drei Differenzierungsmethoden

Methode 1: Dynamische Daten

Jede Seite braucht eigene Fakten – Anwaltszahl, Kanzleien, Honorare aus der Datenbank.

Methode 2: UGC

Nutzerinhalte differenzieren am besten. TripAdvisor: echte Bewertungen pro Hotel.

Im Template z. B. Bewertungsmodul:

<section>
  <h2>Nutzerbewertungen</h2>
  {lawyer.data.reviews.map(review => (
    <div>
      <p>{review.content}</p>
      <span>Bewertung: {review.rating}/5</span>
    </div>
  ))}
</section>

Methode 3: KI-gestützte Erweiterung

Ohne dynamische Daten oder UGC kann KI beschreibende Absätze ergänzen – immer mit menschlicher Prüfung, nie als alleinige Kernsubstanz.

Experiment: Kerndaten aus DB, „Besonderheiten der Rechtslandschaft“ pro Stadt KI-unterstützt – KI nur Ergänzung, Daten sind Pflicht.

Structured Data automatisieren

JSON-LD pro Seite aus echten Daten:

const jsonLd = {
  "@context": "https://schema.org",
  "@type": "LegalService",
  "name": `${lawyer.data.city} Anwaltsdienstleistungen`,
  "areaServed": {
    "@type": "City",
    "name": lawyer.data.city,
  },
  "provider": lawyer.data.topFirms.map(firm => ({
    "@type": "Organization",
    "name": firm,
  })),
};

Kanzleien und Stadt in den SERPs – höhere Klickrate.


Performance: Nutzer nicht warten lassen

Viele Seiten – Performance zählt.

Drei Kennzahlen

TTFB: Serverantwort. SSG meist < 100 ms, SSR 200–500 ms. Über 500 ms steigen Absprünge.

LCP: Hauptinhalt sichtbar – Ziel < 2,5 s.

FID: Interaktionslatenz – Ziel < 100 ms. Zu viel JavaScript bremst Klicks.

CDN für statische Seiten

Cloudflare Pages, Vercel – CDN inklusive.

// astro.config.mjs
export default defineConfig({
  output: 'static',
  build: {
    assets: 'assets/',
  },
  vite: {
    build: {
      rollupOptions: {
        output: {
          assetFileNames: 'assets/[hash][extname]',
        },
      },
    },
  },
});

Gehashte Assets – effizientes CDN-Caching.

Bildoptimierung

Hero-Bilder in Original-JPG können mehrere MB sein.

---
import { Image } from 'astro:assets';
import heroImage from '../images/lawyer-hero.jpg';
---

<Image src={heroImage} alt="Anwaltsdienstleistungen" width={1200} height={675} />

Astro liefert WebP – aus 2 MB oft 200 KB.

Crawl-Budget ab fünftausend Seiten

Google crawlt evtl. nicht alles – Sitemap sharden:

// sitemap-index.xml
<sitemapindex>
  <sitemap><loc>https://example.com/sitemap-1.xml</loc></sitemap>
  <sitemap><loc>https://example.com/sitemap-2.xml</loc></sitemap>
  <sitemap><loc>https://example.com/sitemap-3.xml</loc></sitemap>
</sitemapindex>

Maximal 500 URLs pro Sitemap-Datei.

Wichtige Seiten (hohes Suchvolumen) stärker intern verlinken – Homepage, Navigation. Weniger wichtige Seiten zurückhaltender verlinken.


Fallstudien: Wie es andere machen

TripAdvisor: Hybrid-Architektur

Millionen Hotel-Seiten.

Architektur: SSG + dynamische Updates.

Basisinfos statisch; Bewertungen dynamisch per API.

URL: /hotel/[city]/[hotel-name] – z. B. /hotel/beijing/grand-hyatt, drei Ebenen.

Technik: UGC in Echtzeit, Preisvergleich per API, Review-Schema automatisiert.

Erfolgsfaktor: echte Bewertungen – ohne UGC kein Ranking auf diesem Niveau.

Zapier: ISR-Klassiker

Über fünftausend Integrationsseiten.

Architektur: Next.js ISR – statische Basis, dynamischer Nutzerstatus.

URL: /integrations/[app1]/[app2] – z. B. /integrations/slack/gmail.

Technik: on-demand revalidation, Playwright-Tests pro Seite, App-Hub plus Empfehlungen.

Zapiers Engineering-Blog zu ISR bei fünftausend Seiten lohnt sich.

Wise: SSR + Cache

Wechselkurse minütlich – kein reines SSG.

Architektur: Next.js SSR + stale-while-revalidate.

Cache gültig (z. B. fünf Minuten) → schnelle Antwort, Hintergrund-Update.

URL: /currency/[from]-to-[to] – z. B. /currency/usd-to-eur.

Technik: SWR, CDN Edge Caching, dynamisches JSON-LD.

Vorbild für Echtzeitdaten mit kontrollierten Kosten.


Fallstricke: Was ich selbst erlebt habe

Falle 1: Chaotische URLs

Frühes Anwaltsprojekt: /service?id=lawyer&city=beijing&type=divorce.

Schlechte Indexierung, unklare URLs für Nutzer.

Lektion: URL-Schema vor Launch festlegen – nachträgliche Änderung kostet alle Links und Sitemaps.

Falle 2: Identische Templates

Zwanzigtausend Seiten, nur Stadtname getauscht – Google-Strafe, minus 70 % Traffic.

Lektion: ohne einzigartige Daten keine Seite erzeugen. Lieber tausend gute als zehntausend schlechte.

Falle 3: Performance-Engpass

Fünftausend Seiten per PHP-SSR – Server instabil.

Lektion: ab großen Mengen SSG oder ISR, nicht reines SSR.

Falle 4: Kein Monitoring

Drei Monate ohne Kontrolle – halbe Seiten nicht indexiert, fehlerhafte Sitemap.

Lektion: erste Woche Google Search Console, Screaming Frog, Ahrefs – Index, Technik, Rankings.


Nächste Schritte: Kleiner anfangen

Schritt 1: Kleines Szenario

Nicht sofort fünftausend Seiten – fünfzig Städte als Pilot.

Schritt 2: Stack wählen

Seltene Updates → Astro. Echtzeit → Next.js SSR.

Schritt 3: Daten und URLs

Halber Tag für Felder und Pfade – nicht überspringen.

Schritt 4: Template + Test

Drei Seiten manuell prüfen, dann skalieren.

Schritt 5: Pilot-Launch

Fünfzig Seiten live, eine Woche Index, Absprung, Verweildauer beobachten – dann auf fünfhundert erweitern.

Schritt 6: Iterieren

Template, Links, URLs an Daten anpassen. Programmatic SEO ist Daueraufgabe, kein Einmalprojekt.


FAQ

Statische Generierung, dynamisches Rendering oder Hybrid – was passt wann?
Entscheidend sind Update-Frequenz und Seitenanzahl. Seltene Updates (wöchentlich/monatlich) und weniger als 5.000 Seiten: statische Generierung (Astro). Echtzeitdaten: dynamisches Rendering (Next.js SSR). Dazwischen: ISR als Hybrid.
Wie hoch ist die Obergrenze bei Programmatic-SEO-Seiten?
Keine harte Grenze – aber Crawl-Budget beachten. Bis 5.000 Seiten crawlt Google meist vollständig. 5.000–20.000: Sitemap-Sharding + interne Verlinkung. Über 20.000: strenge Qualitätsfilter, nur Seiten mit Suchvolumen generieren.
Werden templategenerierte Seiten von Google bestraft?
Nein – wenn jede Seite echten Mehrwert liefert. Drei Punkte: einzigartige Daten (nicht nur Keyword-Tausch), Nutzerbeteiligung (UGC oder Interaktion), menschliche Prüfung. Nur Keyword-getauschte Templates werden bestraft.
PostgreSQL oder MongoDB?
Feste Datenstruktur: PostgreSQL – ACID und komplexe Queries sind stabiler. Noch in Entwicklung: MongoDB – flexibles Schema. Kleine Projekte (wenige hundert Einträge): Airtable oder JSON-Dateien reichen.
Wie viele URL-Ebenen maximal?
Empfehlung: nicht mehr als drei. Beispiel `/city/service/type` – tiefer wird es unübersichtlich. Flache URLs (eine Ebene) eignen sich für sehr große Seitenmengen.
Wie automatisiert man interne Verlinkung?
Zwei Strategien: geografische Hierarchie (Stadtseiten verlinken Nachbarstädte) oder Themen-Cluster (ähnliche Service-Seiten verlinken sich). Im Template: anhand von tags oder location passende Seiten finden und Linklisten generieren.
Astro oder Next.js für Programmatic SEO?
Rein statisch: Astro – Content Collections sind für Massenseiten gemacht, schneller Build. Dynamisches Rendering: Next.js mit SSR/ISR. Beide funktionieren – entscheidend ist die Update-Frequenz Ihrer Daten.

11 Min. Lesezeit · Veröffentlicht am: 4. Apr. 2026 · Aktualisiert am: 14. Juli 2026

Kommentare

Melde dich mit GitHub an, um einen Kommentar zu hinterlassen

Easton BlogEaston Blog