Fix: *.pages.dev-Vorschau-Adresse bleibt für immer gesperrt, unabhängig von SITE_PUBLIC

Bisher hätte SITE_PUBLIC=true (gedacht für den Go-Live der eigenen Domain) versehentlich auch die
interne *.pages.dev-Werkstatt-Adresse für jede/n im Internet geöffnet, weil die Middleware nur den
Pfad, nie den aufgerufenen Hostnamen geprüft hat. Jetzt hart anhand des Hostnamens geprüft: nur ein
Hostname außerhalb von *.pages.dev darf durch SITE_PUBLIC öffentlich werden. Per wrangler pages dev
mit Host-Header-Overrides verifiziert (pages.dev -> weiterhin 302 Gate-Redirect, andere Domain -> 200).

Nebenbei: totes, seit 04.08.2026 ungenutztes Secret VERWALTUNG_ACCESS_CODE live + lokal entfernt
(Code prüft seitdem denselben Zugangscode wie der normale Seitenzugang), sowie zwei veraltete
Kommentare bereinigt, die noch auf die längst entfernte Seite /demo-abo/ verwiesen.
This commit is contained in:
qcigano
2026-08-04 15:19:56 +02:00
parent 6fae5a0694
commit 27438426d9
3 changed files with 17 additions and 4 deletions
+15 -1
View File
@@ -31,6 +31,9 @@
ist nie für Kund:innen gedacht. /api/orders (Bestellung ANLEGEN beim Checkout) ist bewusst
NICHT dauerhaft geschützt — das muss auch für echte Kund:innen erreichbar sein, sobald der
Shop öffentlich ist, genau wie der Checkout selbst.
- Die *.pages.dev-Adresse (interne "Werkstatt"/Vorschau, siehe onRequest() unten) bleibt
UNABHÄNGIG vom SITE_PUBLIC-Schalter für immer hinter dem Zugangscode — nur die spätere eigene
Domain soll durch SITE_PUBLIC=true öffentlich werden.
- /verwaltung/* + /api/verwaltung/* verlangen ZUSÄTZLICH zum normalen 90-Tage-Seitenzugang noch
eine zweite, eigene Sitzung, die nur 24 Stunden gültig ist (siehe
functions/_shared/verwaltung-auth.js, /verwaltung-code.html) — auf ausdrücklichen Wunsch.
@@ -184,7 +187,18 @@ export async function onRequest(context) {
// SITE_PUBLIC=true (wrangler pages secret put) — dann öffnet sich der Rest der Seite für alle,
// aber /verwaltung/ bleibt weiterhin komplett hinter dem Zugangscode.
const immerGeschuetzterPfad = url.pathname.startsWith("/verwaltung") || url.pathname.startsWith("/api/verwaltung");
const sitePublic = env.SITE_PUBLIC === "true";
// WICHTIG (04.08.2026, auf ausdrücklichen Wunsch klargestellt): Die *.pages.dev-Adresse ist die
// interne "Werkstatt"/Vorschau-Adresse, unter der qciga und VanVan gemeinsam an der Seite
// arbeiten und Änderungen zuerst begutachten, BEVOR sie über die eigene Domain live gehen —
// diese Adresse soll NIEMALS öffentlich werden, auch nicht aus Versehen. Nur die spätere eigene
// Domain (vans-diy-bastelbedarf.com) soll durch SITE_PUBLIC=true öffentlich geschaltet werden
// können. Ohne diese Unterscheidung würde SITE_PUBLIC=true (gedacht für den Domain-Go-Live)
// versehentlich auch die *.pages.dev-Vorschau-Adresse für jede/n im Internet öffnen — genau das
// darf nie passieren, deshalb hier hart anhand des aufgerufenen Hostnamens geprüft, unabhängig
// vom SITE_PUBLIC-Wert.
const istWorkVorschauHost = url.hostname.endsWith(".pages.dev");
const sitePublic = env.SITE_PUBLIC === "true" && !istWorkVorschauHost;
if (sitePublic && !immerGeschuetzterPfad) {
return next();
}
+1 -1
View File
@@ -20,7 +20,7 @@ interface Props {
path?: string;
/** Seite existiert nur auf Deutsch (Rechtstexte) — siehe LanguageSwitcher. */
legalOnly?: boolean;
/** Interne Vorschau-/Demoseiten (z.B. /demo-abo/) sollen nie von Suchmaschinen indexiert
/** Interne Vorschau-/Demoseiten (z.B. /verwaltung/) sollen nie von Suchmaschinen indexiert
* werden — setzt zusätzlich zum Sitemap-Ausschluss noch ein robots-Meta. */
noindex?: boolean;
}
+1 -2
View File
@@ -799,8 +799,7 @@ const angekommeneBestellungen = beispielBestellungen.filter((b) => b.status ===
datenSection?.scrollIntoView({ behavior: "smooth", block: "start" });
});
// Deep-Link per URL-Hash (z.B. /konto/angemeldet/#abo) — springt direkt zum passenden Tab,
// genutzt u.a. von der Vorschau-Seite /demo-abo/.
// Deep-Link per URL-Hash (z.B. /konto/angemeldet/#abo) — springt direkt zum passenden Tab.
const hashTab = location.hash.replace("#", "");
const gueltigeHashTabs = ["bestellungen", "offene", "wunschliste", "daten", "treuebonus", "abo"];
setActiveTab(gueltigeHashTabs.includes(hashTab) ? hashTab : null);