Landing-Marketing / SEO-Infrastruktur / a11y-Viewport)

This commit is contained in:
2026-07-20 19:46:08 +02:00
parent 9871401fbc
commit c4cb12b26e
15 changed files with 270 additions and 63 deletions
+3
View File
@@ -7,6 +7,9 @@
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/(var|database|scripts|docs|app|lib)/ [NC]
RewriteRule ^ - [F]
# Konventionelle /sitemap.xml auf die dynamische, host-korrekte Sitemap.
RewriteRule ^sitemap\.xml$ sitemap.php [L]
</IfModule>
<FilesMatch "^(env\.local\.php|env\.local\.example\.php|\.env.*|composer\.(json|lock))$">
+1 -1
View File
@@ -4,7 +4,7 @@
<head>
<title>AGB Kaffeeliste</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="assets/css/main.css" />
<link rel="stylesheet" href="assets/css/public.css" />
</head>
+88 -1
View File
@@ -63,10 +63,25 @@ body.public-page {
.public-hero p {
color: #3d4449;
font-size: 1.15em;
max-width: 34rem;
}
.public-hero-lead {
font-size: 1.15em;
}
.public-hero-sub {
font-size: 1.05em;
color: #38761d;
margin-top: -0.4rem;
}
.public-hero-reassure {
font-size: 0.85em;
color: #7f888f;
margin-top: 0.85rem;
}
.public-section {
padding: 4rem 6vw;
}
@@ -117,6 +132,78 @@ body.public-page {
background: #eef4ea;
}
/* Trust-Band direkt unter dem Hero: faktische Vertrauensanker, kein Fließtext. */
.public-trust {
background: #38761d;
padding: 1rem 6vw;
}
.public-trust ul {
list-style: none;
margin: 0 auto;
padding: 0;
max-width: 72rem;
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 0.5rem 1.75rem;
}
.public-trust li {
color: #ffffff;
font-size: 0.9em;
padding-left: 1.4rem;
position: relative;
}
.public-trust li:before {
content: "\2713";
position: absolute;
left: 0;
font-weight: 700;
}
/* Zielgruppen-Chips zur Selbst-Identifikation des Besuchers. */
.public-audience-list {
list-style: none;
margin: 0 auto;
padding: 0;
max-width: 60rem;
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 0.75rem;
}
.public-audience-list li {
border: solid 1px rgba(210, 215, 217, 0.9);
border-radius: 999px;
padding: 0.5rem 1.1rem;
color: #3d4449;
background: #ffffff;
font-size: 0.95em;
}
.public-price {
font-family: "Roboto Slab", serif;
font-size: 1.5em;
color: #38761d;
font-weight: 700;
}
.public-price span {
font-family: inherit;
font-size: 0.55em;
color: #7f888f;
font-weight: 400;
}
.public-cta-reassure {
font-size: 0.85em;
color: #7f888f;
margin-top: 1rem;
}
.public-fineprint {
max-width: 72rem;
margin-left: auto;
+1 -1
View File
@@ -4,7 +4,7 @@
<head>
<title>Datenschutzerklärung Kaffeeliste</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="assets/css/main.css" />
<link rel="stylesheet" href="assets/css/public.css" />
</head>
+1 -1
View File
@@ -15,7 +15,7 @@ $result = $token !== ''
<head>
<title>Kaffeeliste E-Mail verifizieren</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="assets/css/main.css" />
<link rel="stylesheet" href="assets/css/public.css" />
</head>
+1 -1
View File
@@ -8,7 +8,7 @@
<head>
<title>Kaffeeliste</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="assets/css/main.css" />
</head>
<body class="is-preload">
+1 -1
View File
@@ -4,7 +4,7 @@
<head>
<title>Impressum Kaffeeliste</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="assets/css/main.css" />
<link rel="stylesheet" href="assets/css/public.css" />
</head>
+132 -52
View File
@@ -1,13 +1,83 @@
<?php require_once __DIR__ . '/app/bootstrap.php'; ?>
<?php
require_once __DIR__ . '/app/bootstrap.php';
// Absolute Basis-URL fuer Open-Graph/Canonical: die Landingpage laeuft auf der
// Marketing-Domain (nicht APP_HOST), daher aus dem aktuellen Request ableiten.
$landingScheme = app_is_https() ? 'https' : 'http';
$landingHost = (string)($_SERVER['HTTP_HOST'] ?? '');
$landingBase = $landingHost !== '' ? $landingScheme . '://' . $landingHost : '';
$landingUrl = $landingBase !== '' ? $landingBase . '/' : '';
$landingImage = $landingBase !== '' ? $landingBase . '/assets/images/landing-hero.png' : '';
$metaDescription = 'Kaffeeliste automatisiert die Abrechnung eurer Kaffeekasse: Guthaben, Zahlungen und offene Beträge immer im Blick. In 5 Minuten startklar, kostenlos für Teams bis 10 Personen.';
$faqItems = [
['Wie schnell ist meine Kaffeeliste startklar?', 'Kundenkonto anlegen, Mitglieder eintragen, loslegen. Es ist keine Einrichtung durch uns nötig, und die bestehenden Abläufe rund um Striche und Einzahlungen bleiben dieselben.'],
['Was kostet die Kaffeeliste?', 'Bis 10 Teilnehmer kostenlos, danach gestaffelt nach Teamgröße ab 3,99 € im Monat ohne Kosten pro Kopf.'],
['Sind unsere Daten von denen anderer Kunden getrennt?', 'Ja. Jeder Kunde hat einen eigenen, isolierten Bereich für Mitglieder, Buchungen und Einstellungen. Diese Trennung ist fester Bestandteil der App und wird automatisiert geprüft.'],
['Wer darf in unserem Team was ändern?', 'Ihr vergebt Rollen wie Administrator, Kassenwart oder Mitglied gezielt pro Person und könnt den Zugang jederzeit wieder entziehen, ohne den Mitgliedseintrag selbst zu löschen.'],
['Können wir unsere Daten exportieren oder löschen lassen?', 'Ja. Ihr könnt alle gespeicherten Daten jederzeit als Export herunterladen und einzelne Mitglieder oder euren gesamten Kundenbereich selbstständig wieder entfernen lassen.'],
['Müssen wir PayPal nutzen?', 'Nein, PayPal ist optional und lässt sich in den Mandant-Einstellungen aktivieren. Einzahlungen können weiterhin auch manuell erfasst werden.'],
];
$faqLd = [
'@context' => 'https://schema.org',
'@type' => 'FAQPage',
'mainEntity' => array_map(static function (array $item): array {
return [
'@type' => 'Question',
'name' => $item[0],
'acceptedAnswer' => ['@type' => 'Answer', 'text' => $item[1]],
];
}, $faqItems),
];
$productLd = [
'@context' => 'https://schema.org',
'@type' => 'SoftwareApplication',
'name' => 'Kaffeeliste',
'applicationCategory' => 'BusinessApplication',
'operatingSystem' => 'Web',
'description' => $metaDescription,
'offers' => [
['@type' => 'Offer', 'price' => '0', 'priceCurrency' => 'EUR', 'description' => 'Bis 10 Teilnehmer'],
['@type' => 'Offer', 'price' => '3.99', 'priceCurrency' => 'EUR', 'description' => 'Bis 25 Teilnehmer / Monat'],
['@type' => 'Offer', 'price' => '7.99', 'priceCurrency' => 'EUR', 'description' => 'Bis 50 Teilnehmer / Monat'],
['@type' => 'Offer', 'price' => '12.99', 'priceCurrency' => 'EUR', 'description' => 'Bis 150 Teilnehmer / Monat'],
],
];
$jsonFlags = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE;
?>
<!DOCTYPE HTML>
<html lang="de">
<head>
<title>Kaffeeliste die digitale Kaffeekasse für Teams</title>
<title>Kaffeeliste die digitale Kaffeekasse, die von allein mitrechnet</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
<meta name="description" content="Kaffeeliste automatisiert die Abrechnung eurer Kaffeekasse: Guthaben, Zahlungen und offene Beträge immer im Blick ab 0 € im Monat, in Minuten startklar." />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="description" content="<?php echo htmlspecialchars($metaDescription, ENT_QUOTES, 'UTF-8'); ?>" />
<meta name="theme-color" content="#38761d" />
<?php if ($landingUrl !== ''): ?>
<link rel="canonical" href="<?php echo htmlspecialchars($landingUrl, ENT_QUOTES, 'UTF-8'); ?>" />
<?php endif; ?>
<meta property="og:type" content="website" />
<meta property="og:site_name" content="Kaffeeliste" />
<meta property="og:title" content="Die Kaffeekasse, die von allein mitrechnet" />
<meta property="og:description" content="<?php echo htmlspecialchars($metaDescription, ENT_QUOTES, 'UTF-8'); ?>" />
<meta property="og:locale" content="de_DE" />
<?php if ($landingUrl !== ''): ?>
<meta property="og:url" content="<?php echo htmlspecialchars($landingUrl, ENT_QUOTES, 'UTF-8'); ?>" />
<?php endif; ?>
<?php if ($landingImage !== ''): ?>
<meta property="og:image" content="<?php echo htmlspecialchars($landingImage, ENT_QUOTES, 'UTF-8'); ?>" />
<meta name="twitter:image" content="<?php echo htmlspecialchars($landingImage, ENT_QUOTES, 'UTF-8'); ?>" />
<?php endif; ?>
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Die Kaffeekasse, die von allein mitrechnet" />
<meta name="twitter:description" content="<?php echo htmlspecialchars($metaDescription, ENT_QUOTES, 'UTF-8'); ?>" />
<link rel="preload" as="image" href="assets/images/landing-hero.png" />
<link rel="stylesheet" href="assets/css/main.css" />
<link rel="stylesheet" href="assets/css/public.css" />
<script type="application/ld+json"><?php echo json_encode($productLd, $jsonFlags); ?></script>
<script type="application/ld+json"><?php echo json_encode($faqLd, $jsonFlags); ?></script>
</head>
<body class="is-preload public-page">
<div class="public-shell">
@@ -21,14 +91,41 @@
</nav>
<div class="public-hero-content">
<h1>Die Kaffeekasse, die von allein mitrechnet</h1>
<p>Die Striche macht ihr weiterhin ganz klassisch an der Maschine auf der ausgedruckten Liste, wie eh und je. Den Rest übernimmt Kaffeeliste: Guthaben, Zahlungen und offene Beträge sind für alle jederzeit auf einen Blick sichtbar. Schluss mit Kopfrechnen, Excel-Tabellen und dem lästigen Kassensturz am Monatsende.</p>
<p class="public-hero-lead">Schluss mit Kopfrechnen, Zettelwirtschaft und dem lästigen Kassensturz am Monatsende. Wer wie viel offen hat, sieht jeder auf einen Blick ihr macht nur noch die Striche, den Rest erledigt Kaffeeliste.</p>
<p class="public-hero-sub"><strong>In 5 Minuten startklar. Kostenlos für Teams bis 10 Personen.</strong></p>
<ul class="actions">
<li><a href="<?php echo htmlspecialchars(app_primary_url('register.php'), ENT_QUOTES, 'UTF-8'); ?>" class="button primary big">Kostenlos einrichten</a></li>
<li><a href="<?php echo htmlspecialchars(app_primary_url('login.php'), ENT_QUOTES, 'UTF-8'); ?>" class="button big">Zur App</a></li>
</ul>
<p class="public-hero-reassure">Keine Kreditkarte nötig&nbsp;· in wenigen Minuten startklar&nbsp;· jederzeit kündbar</p>
</div>
</section>
<section class="public-trust" aria-label="Auf einen Blick">
<ul>
<li>Bis 10&nbsp;Personen kostenlos</li>
<li>Ohne Kreditkarte starten</li>
<li>DSGVO-konform: Daten jederzeit export- &amp; löschbar</li>
<li>§&nbsp;19&nbsp;UStG keine Mehrwertsteuer</li>
<li>Bestehende Abläufe bleiben</li>
</ul>
</section>
<section class="public-section public-audience">
<header class="major">
<h2>Für jede Teeküche gemacht</h2>
<p>Überall dort, wo mehrere Leute an einer Maschine trinken und am Ende niemand nachrechnen will.</p>
</header>
<ul class="public-audience-list">
<li>Büros &amp; Agenturen</li>
<li>Arzt- &amp; Zahnarztpraxen</li>
<li>Vereine</li>
<li>Werkstätten &amp; Betriebe</li>
<li>Kanzleien</li>
<li>Gemeinschaftsküchen</li>
</ul>
</section>
<section class="public-section">
<header class="major">
<h2>So funktioniert's</h2>
@@ -55,68 +152,68 @@
<section class="public-section">
<header class="major">
<h2>Alles rund um die Kaffeekasse</h2>
<p>Kein Feature-Wildwuchs nur, was ein Team wirklich braucht.</p>
<h2>Was dein Team davon hat</h2>
<p>Für alle, die einfach nur Kaffee trinken wollen ohne Diskussionen über die Kasse.</p>
</header>
<div class="public-grid">
<article class="public-feature">
<h3>Immer der richtige Zugriff</h3>
<p>Neue Kolleg:innen sind in einer Minute angelegt, wer geht, ist genauso schnell wieder draußen. Rollen wie Admin oder Kassenwart vergebt ihr gezielt zum Beispiel für die Praktikantin, die nur Striche einträgt, aber nichts an den Einstellungen ändern kann.</p>
<h3>Jeder sieht seinen Stand</h3>
<p>Kein Nachfragen, kein böses Erwachen: Guthaben oder offener Betrag stehen jederzeit im eigenen Dashboard am Handy in der Teeküche oder am Rechner.</p>
</article>
<article class="public-feature">
<h3>Nie wieder „Wer hat schon bezahlt?"</h3>
<p>Jede Einzahlung, jeder Strich, jede Korrektur landet automatisch im gemeinsamen Kontobuch nachvollziehbar bis zum ersten Tag. Praktisch beim Jahresabschluss: ein Klick, fertig.</p>
<h3>Strich in zwei Sekunden</h3>
<p>Ein Tipp auf „Ein Strich" oder „Zwei Striche" im eigenen Konto der Verbrauch wird automatisch richtig zugeordnet. Nichts eintragen, nichts nachtragen.</p>
</article>
<article class="public-feature">
<h3>Bezahlen in 10 Sekunden</h3>
<p>Wer offen ist, bekommt einen fertigen PayPal-Link mit passendem Betrag. Kein Bargeld, kein Wechselgeld-Chaos in der Teeküche.</p>
<h3>Bezahlen ohne Kleingeld</h3>
<p>Offener Betrag? Ein fertiger PayPal-Link mit dem passenden Betrag wartet schon. Kein Bargeld, kein „Ich hab's gleich".</p>
</article>
<article class="public-feature">
<h3>Die Liste an der Wand bleibt</h3>
<p>Ausdrucken, aufhängen, fertig mit eigenem Hinweistext als Wasserzeichen und automatisch passender Zeilengröße, egal ob 5 oder 150 Kolleg:innen mitmachen.</p>
<p>Der vertraute Ausdruck neben der Maschine bleibt jetzt mit eurem eigenen Hinweistext als Wasserzeichen und automatisch passender Zeilengröße.</p>
</article>
<article class="public-feature">
<h3>Alle informiert, ohne Rundmail-Chaos</h3>
<p>Ein Hinweisbanner für „Die Maschine ist kaputt" oder eine Erinnerungsmail an alle mit offenem Betrag in einer Minute verschickt statt einzeln nachgefragt.</p>
<h3>Ein Hinweis für alle</h3>
<p>„Maschine ist kaputt" oder „Neue Sorte da"? Ein Banner erscheint für alle sichtbar in der App ohne Rundmail und Zettel am Kühlschrank.</p>
</article>
</div>
</section>
<section class="public-section public-highlight">
<header class="major">
<h2>6 Gründe, warum Verwalter Kaffeeliste lieben</h2>
<p>Für Admin und Kassenwart macht das den größten Unterschied im Alltag.</p>
<h2>6 Gründe, warum Kassenwarte Kaffeeliste lieben</h2>
<p>Der Papierkram der Kaffeekasse ab jetzt erledigt sich der größtenteils selbst.</p>
</header>
<div class="public-grid public-steps public-advantages">
<article class="public-feature">
<span class="public-step-number">1</span>
<h3>Kein Taschenrechner mehr</h3>
<p>Salden berechnen sich automatisch. Keine manuelle Addition von Strichen und Zahlungen am Monatsende.</p>
<p>Salden berechnen sich automatisch. Nie wieder Striche und Zahlungen am Monatsende von Hand zusammenzählen.</p>
</article>
<article class="public-feature">
<span class="public-step-number">2</span>
<h3>Ein Klick statt Excel-Akrobatik</h3>
<p>Jahresabschluss, Mitgliederliste, Export direkt aus der App statt mühsamer Tabellenpflege nebenbei.</p>
<h3>Jahresabschluss auf Knopfdruck</h3>
<p>Auswertung fürs ganze Jahr direkt aus der App statt Excel-Formeln zu pflegen, die keiner mehr versteht.</p>
</article>
<article class="public-feature">
<span class="public-step-number">3</span>
<h3>Erinnerungen laufen von allein</h3>
<p>Eine Info-Mail an alle mit offenem Betrag, statt jede Person einzeln anzuschreiben oder anzusprechen.</p>
<p>Eine Info-Mail an alle mit offenem Betrag statt jede Person einzeln anzuschreiben oder in der Küche anzusprechen.</p>
</article>
<article class="public-feature">
<span class="public-step-number">4</span>
<h3>Mitgliederverwaltung in Sekunden</h3>
<h3>Mitglieder in Sekunden verwaltet</h3>
<p>Neue Kolleg:innen anlegen, alte deaktivieren, Rollen vergeben ohne Rückfragen, wer worauf Zugriff hat.</p>
</article>
<article class="public-feature">
<span class="public-step-number">5</span>
<h3>PayPal-Abgleich ohne Nachrechnen</h3>
<p>Eingehende Zahlungen ordnen sich automatisch dem richtigen Mitglied zu kein Abgleich von Hand mehr.</p>
<p>Eingehende Zahlungen lassen sich per Export einlesen und dem richtigen Mitglied zuordnen inklusive Dublettenprüfung.</p>
</article>
<article class="public-feature">
<span class="public-step-number">6</span>
<h3>Der Stand ist immer griffbereit</h3>
<p>Ob am Handy in der Teeküche oder am Rechner im Büro: Der Kassenstand ist nie veraltet oder in der falschen Datei.</p>
<h3>Kein Feilschen mehr</h3>
<p>Jede Buchung ist nachvollziehbar bis zum ersten Tag. Diskussionen über „Ich hab aber weniger getrunken" erledigen sich von selbst.</p>
</article>
</div>
</section>
@@ -129,19 +226,19 @@
<div class="public-grid">
<article class="public-feature">
<h3>Bis 10 Teilnehmer</h3>
<p><strong>Kostenlos</strong></p>
<p class="public-price">Kostenlos</p>
</article>
<article class="public-feature">
<h3>Bis 25 Teilnehmer</h3>
<p><strong>3,99 € / Monat</strong></p>
<p class="public-price">3,99 €<span> / Monat</span></p>
</article>
<article class="public-feature">
<h3>Bis 50 Teilnehmer</h3>
<p><strong>7,99 € / Monat</strong></p>
<p class="public-price">7,99 €<span> / Monat</span></p>
</article>
<article class="public-feature">
<h3>Bis 150 Teilnehmer</h3>
<p><strong>12,99 € / Monat</strong></p>
<p class="public-price">12,99 €<span> / Monat</span></p>
</article>
</div>
<p class="public-fineprint">Mehr als 150 Teilnehmer? <a href="<?php echo htmlspecialchars(app_primary_url('preise.php'), ENT_QUOTES, 'UTF-8'); ?>">Preis auf Anfrage</a>. Gemäß § 19 UStG wird keine Umsatzsteuer berechnet die genannten Beträge sind die tatsächlich zu zahlenden Endpreise. Details unter <a href="<?php echo htmlspecialchars(app_primary_url('preise.php'), ENT_QUOTES, 'UTF-8'); ?>">Preise</a>.</p>
@@ -162,30 +259,12 @@
<h2>Häufige Fragen</h2>
</header>
<div class="public-faq">
<?php foreach ($faqItems as $item): ?>
<div class="public-panel">
<h3>Wie schnell ist meine Kaffeeliste startklar?</h3>
<p>Kundenkonto anlegen, Mitglieder eintragen, loslegen. Es ist keine Einrichtung durch uns nötig, und die bestehenden Abläufe rund um Striche und Einzahlungen bleiben dieselben.</p>
</div>
<div class="public-panel">
<h3>Was kostet die Kaffeeliste?</h3>
<p>Bis 10 Teilnehmer kostenlos, danach gestaffelt nach Teamgröße ab 3,99 € im Monat ohne Kosten pro Kopf. Details unter <a href="<?php echo htmlspecialchars(app_primary_url('preise.php'), ENT_QUOTES, 'UTF-8'); ?>">Preise</a>.</p>
</div>
<div class="public-panel">
<h3>Sind unsere Daten von denen anderer Kunden getrennt?</h3>
<p>Ja. Jeder Kunde hat einen eigenen, isolierten Bereich für Mitglieder, Buchungen und Einstellungen. Diese Trennung ist fester Bestandteil der App und wird automatisiert geprüft.</p>
</div>
<div class="public-panel">
<h3>Wer darf in unserem Team was ändern?</h3>
<p>Ihr vergebt Rollen wie Administrator, Kassenwart oder Mitglied gezielt pro Person und könnt den Zugang jederzeit wieder entziehen, ohne den Mitgliedseintrag selbst zu löschen.</p>
</div>
<div class="public-panel">
<h3>Können wir unsere Daten exportieren oder löschen lassen?</h3>
<p>Ja. Ihr könnt alle gespeicherten Daten jederzeit als Export herunterladen und einzelne Mitglieder oder euren gesamten Kundenbereich selbstständig wieder entfernen lassen.</p>
</div>
<div class="public-panel">
<h3>Müssen wir PayPal nutzen?</h3>
<p>Nein, PayPal ist optional und lässt sich in den Mandant-Einstellungen aktivieren. Einzahlungen können weiterhin auch manuell erfasst werden.</p>
<h3><?php echo htmlspecialchars($item[0], ENT_QUOTES, 'UTF-8'); ?></h3>
<p><?php echo htmlspecialchars($item[1], ENT_QUOTES, 'UTF-8'); ?></p>
</div>
<?php endforeach; ?>
</div>
</section>
@@ -198,6 +277,7 @@
<li><a href="<?php echo htmlspecialchars(app_primary_url('register.php'), ENT_QUOTES, 'UTF-8'); ?>" class="button primary big">Kundenkonto anlegen</a></li>
<li><a href="<?php echo htmlspecialchars(app_primary_url('login.php'), ENT_QUOTES, 'UTF-8'); ?>" class="button big">Zur App</a></li>
</ul>
<p class="public-cta-reassure">Bis 10 Personen kostenlos&nbsp;· keine Kreditkarte nötig&nbsp;· jederzeit kündbar</p>
</section>
</div>
+1 -1
View File
@@ -47,7 +47,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
<head>
<title>Kaffeeliste Login</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="assets/css/main.css" />
<link rel="stylesheet" href="assets/css/public.css" />
</head>
+1 -1
View File
@@ -45,7 +45,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
<head>
<title>Kaffeeliste Passwort vergessen</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="assets/css/main.css" />
<link rel="stylesheet" href="assets/css/public.css" />
</head>
+1 -1
View File
@@ -33,7 +33,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
<head>
<title>Kaffeeliste Passwort zurücksetzen</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="assets/css/main.css" />
<link rel="stylesheet" href="assets/css/public.css" />
</head>
+1 -1
View File
@@ -4,7 +4,7 @@
<head>
<title>Preise Kaffeeliste</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="assets/css/main.css" />
<link rel="stylesheet" href="assets/css/public.css" />
</head>
+1 -1
View File
@@ -51,7 +51,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
<head>
<title>Kaffeeliste Registrierung</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="assets/css/main.css" />
<link rel="stylesheet" href="assets/css/public.css" />
</head>
+17
View File
@@ -0,0 +1,17 @@
User-agent: *
Allow: /$
Allow: /landing.php
Allow: /preise.php
Allow: /impressum.php
Allow: /agb.php
Allow: /datenschutz.php
Disallow: /index.php
Disallow: /login.php
Disallow: /register.php
Disallow: /konto.php
Disallow: /backoffice.php
Disallow: /var/
Disallow: /app/
Disallow: /scripts/
Sitemap: /sitemap.xml
+20
View File
@@ -0,0 +1,20 @@
<?php
// Dynamische Sitemap: gibt absolute URLs anhand des tatsaechlichen Request-
// Hosts aus, damit sie unabhaengig von der Domain (Marketing-Domain, Test-
// umgebung) immer korrekt ist. Per .htaccess auch unter /sitemap.xml erreichbar.
require_once __DIR__ . '/app/bootstrap.php';
$scheme = app_is_https() ? 'https' : 'http';
$host = (string)($_SERVER['HTTP_HOST'] ?? '');
$base = $host !== '' ? $scheme . '://' . $host : '';
$pages = ['', 'preise.php', 'impressum.php', 'agb.php', 'datenschutz.php'];
header('Content-Type: application/xml; charset=utf-8');
echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
foreach ($pages as $page) {
$loc = $base . '/' . $page;
echo ' <url><loc>' . htmlspecialchars($loc, ENT_QUOTES, 'UTF-8') . '</loc></url>' . "\n";
}
echo '</urlset>' . "\n";