diff --git a/server/index.js b/server/index.js index 74700274..96a73439 100644 --- a/server/index.js +++ b/server/index.js @@ -99,7 +99,7 @@ app.use((req, res, next) => { Begruendung und die beiden Fallstricke stehen in workspace-umzug.js — sie sind dort als eigene Funktion pruefbar (pruef-workspace-umzug.mjs). Steht bewusst FRUEH: vor jeder Schranke, damit auch die Anmeldeseite - und die 404-Seite unter der alten Adresse weiterleiten. */ + unter der alten Adresse nicht mehr erscheint. */ app.use(workspaceUmzug); /* Inhaltsrichtlinie (26.08.2026). Steht bewusst HIER -- vor jeder diff --git a/server/pruef-workspace-umzug.mjs b/server/pruef-workspace-umzug.mjs index 395047c3..04c73f76 100644 --- a/server/pruef-workspace-umzug.mjs +++ b/server/pruef-workspace-umzug.mjs @@ -1,13 +1,14 @@ /* ===================================================================== - Prüft die Umzugs-Weiterleitung des Creator Workspace. + Prüft, WELCHE Anfragen der abgeschalteten alten Workspace-Adresse + zugeordnet werden. Zwei Fehler waeren hier teuer, und beide sieht man einer Bedingung nicht an: - 1. ENDLOSSCHLEIFE. Derselbe Dienst bedient die alte UND die neue - Adresse. Wer nicht auf den Hostnamen prueft, leitet die neue - Adresse immer wieder auf sich selbst -- der Workspace waere fuer - alle unerreichbar, und zwar sofort nach dem Neustart. + 1. DIE NEUE ADRESSE MIT ABSCHALTEN. Derselbe Dienst bedient die alte + UND die neue Adresse. Wer nicht auf den Hostnamen prueft, sperrt + den Workspace fuer alle aus -- sofort nach dem Neustart und ohne + dass es vorher irgendwo auffaellt. 2. PRAEFIX-IRRTUM. "faengt an mit /workspace" trifft auch /workspaceXYZ oder /workspace-alt -- Pfade, die nicht zum @@ -20,11 +21,11 @@ Aufruf: node server/pruef-workspace-umzug.mjs ===================================================================== */ -import { sollUmgeleitetWerden, NEUE_ADRESSE } from "./workspace-umzug.js"; +import { istAlteWorkspaceAdresse, NEUE_ADRESSE } from "./workspace-umzug.js"; /* [Host, Pfad, erwartet, Begruendung] */ const FAELLE = [ - // --- muss weiterleiten --- + // --- muss abgeschaltet sein (410 Gone) --- ["dogfather-universe.com", "/workspace/", true, "alte Adresse, Startseite"], ["dogfather-universe.com", "/workspace", true, "alte Adresse, ohne Schraegstrich"], ["dogfather-universe.com", "/workspace/start.html", true, "alte Adresse, Unterseite"], @@ -33,12 +34,12 @@ const FAELLE = [ ["DOGFATHER-UNIVERSE.COM", "/workspace/", true, "Grossschreibung darf egal sein"], ["dogfather-universe.com:443", "/workspace/", true, "Portangabe darf egal sein"], - // --- darf NICHT weiterleiten: sonst Endlosschleife --- - ["workspace.dogfather-universe.com", "/workspace/", false, "NEUE Adresse -- sonst Endlosschleife"], + // --- darf NIEMALS abgeschaltet werden: das ist der neue Ort --- + ["workspace.dogfather-universe.com", "/workspace/", false, "NEUE Adresse -- darf NIE abgeschaltet werden"], ["workspace.dogfather-universe.com", "/workspace/start.html", false, "NEUE Adresse, Unterseite"], ["workspace.dogfather-universe.com", "/workspace/api/aufgaben", false, "NEUE Adresse, Schnittstelle"], - // --- darf NICHT weiterleiten: gehoert nicht zum Workspace --- + // --- darf nicht betroffen sein: gehoert nicht zum Workspace --- ["dogfather-universe.com", "/", false, "Hauptseite"], ["dogfather-universe.com", "/index.html", false, "Hauptseite"], ["dogfather-universe.com", "/webdesign/", false, "anderer Bereich"], @@ -46,7 +47,7 @@ const FAELLE = [ ["dogfather-universe.com", "/workspace-alt/seite", false, "PRAEFIX-IRRTUM mit Bindestrich"], ["dogfather-universe.com", "/assets/css/main.css", false, "gemeinsame Datei"], - // --- darf NICHT weiterleiten: lokale Tests wuerden sonst scheitern --- + // --- darf nicht betroffen sein: lokale Tests wuerden sonst scheitern --- ["127.0.0.1:4100", "/workspace/", false, "lokaler Testserver"], ["localhost:4100", "/workspace/start.html", false, "lokaler Testserver"], @@ -58,27 +59,27 @@ const FAELLE = [ let geprueft = 0; const fehler = []; for (const [host, pfad, erwartet, grund] of FAELLE) { - const ist = sollUmgeleitetWerden(host, pfad); + const ist = istAlteWorkspaceAdresse(host, pfad); geprueft++; if (ist !== erwartet) { - fehler.push(`${host || "(leer)"}${pfad} -> ${ist ? "leitet um" : "leitet NICHT um"}, erwartet ${erwartet ? "umleiten" : "nicht umleiten"} (${grund})`); + fehler.push(`${host || "(leer)"}${pfad} -> ${ist ? "abgeschaltet" : "erreichbar"}, erwartet ${erwartet ? "abgeschaltet" : "erreichbar"} (${grund})`); } } /* Gegenprobe: Kann diese Pruefung ueberhaupt "nein" sagen? Ein Fall, von dem wir wissen, dass er falsch ist, MUSS auffallen. */ -const gegenprobe = sollUmgeleitetWerden("dogfather-universe.com", "/workspace/") === true - && sollUmgeleitetWerden("workspace.dogfather-universe.com", "/workspace/") === false; +const gegenprobe = istAlteWorkspaceAdresse("dogfather-universe.com", "/workspace/") === true + && istAlteWorkspaceAdresse("workspace.dogfather-universe.com", "/workspace/") === false; -/* Und das Ziel muss stimmen -- eine Weiterleitung auf die falsche Adresse - waere schlimmer als gar keine. */ +/* Und die genannte neue Adresse muss stimmen -- sie steht auf der + Hinweisseite, die abgemeldete Nutzer zu sehen bekommen. */ const zielStimmt = NEUE_ADRESSE === "https://workspace.dogfather-universe.com"; geprueft++; if (!zielStimmt) fehler.push(`Ziel ist "${NEUE_ADRESSE}", erwartet https://workspace.dogfather-universe.com`); const SOLL = FAELLE.length + 1; console.log(`${geprueft} Faelle geprueft (erwartet ${SOLL}), ${fehler.length} Beanstandungen.`); -console.log(`Gegenprobe (alt leitet um, neu nicht): ${gegenprobe ? "ja" : "NEIN"}`); +console.log(`Gegenprobe (alt abgeschaltet, neu erreichbar): ${gegenprobe ? "ja" : "NEIN"}`); for (const f of fehler) console.log(" FEHL " + f); if (geprueft !== SOLL) { console.log("FEHL: Anzahl stimmt nicht."); process.exit(1); } diff --git a/server/workspace-umzug.js b/server/workspace-umzug.js index d10ac069..79db0c4b 100644 --- a/server/workspace-umzug.js +++ b/server/workspace-umzug.js @@ -1,69 +1,113 @@ /* ===================================================================== Umzug des Creator Workspace auf eine eigene Adresse (06.09.2026) - Der Workspace liegt seit diesem Tag auf + Der Workspace liegt seit diesem Tag ausschliesslich auf workspace.dogfather-universe.com - und ist unter der alten Adresse dogfather-universe.com/workspace/ nur - noch als Weiterleitung erreichbar. + Unter der alten Adresse dogfather-universe.com/workspace/ gibt es ihn + nicht mehr — dort antwortet der Server mit 410 "Gone". - WARUM: Chrome laesst neben der Hauptseite, deren Bereich "/" die ganze - Domain umfasst, keine zweite App auf derselben Adresse zu. Unter dem - alten Pfad liess sich der Workspace deshalb nur als Verknuepfung - ablegen, nie als richtige App installieren -- im Menue stand "Oeffnen - in DOGFATHER UNIVERSE" statt "Seite als App installieren". Das ist kein + WARUM DER UMZUG: Chrome laesst neben der Hauptseite, deren Bereich "/" + die ganze Domain umfasst, keine zweite App auf derselben Adresse zu. + Unter dem alten Pfad liess sich der Workspace nur als Verknuepfung + ablegen, nie als richtige App installieren -- im Menue stand "Oeffnen in + DOGFATHER UNIVERSE" statt "Seite als App installieren". Das ist kein Fehler, sondern Absicht (w3c/manifest Nr. 1180: verschachtelte Bereiche - auf einem Ursprung sind "strongly not recommended"). Eine eigene - Adresse ist der einzige Weg. + auf einem Ursprung sind "strongly not recommended"). - Der PFAD /workspace/ bleibt erhalten. An ihm haengen 150 Server-Routen, - 107 API-Aufrufe und 26 Server-Dateien -- ihn wegzuschneiden waere ein - grosser Umbau ohne Gewinn, denn der Konflikt entsteht durch die - gemeinsame ADRESSE, nicht durch den Pfad. + Der PFAD /workspace/ bleibt erhalten und wird weiterhin gebraucht -- + allerdings nur noch unter der NEUEN Adresse. An ihm haengen 150 + Server-Routen, 107 API-Aufrufe und 26 Server-Dateien; ihn wegzuschneiden + waere ein grosser Umbau ohne Gewinn, denn der Konflikt entstand durch + die gemeinsame ADRESSE, nicht durch den Pfad. + + WARUM 410 UND NICHT 404: Beides heisst "gibt es hier nicht". 410 sagt + zusaetzlich "gab es, ist absichtlich weg, kommt nicht wieder" -- genau + der Sachverhalt. Suchmaschinen nehmen die Adresse dadurch schneller + heraus, und in einem Protokoll ist ein 410 sofort als gewollt zu + erkennen, waehrend ein 404 immer nach Versehen aussieht. + + WARUM KEINE WEITERLEITUNG (Entscheidung von Filipe, 06.09.2026): Er + gibt den neuen Link selbst an Creator und Scouts weiter. Eine + Weiterleitung haette die alte Adresse auf unbestimmte Zeit am Leben + gehalten. Wichtig zu wissen: Wer die alte Adresse als App installiert + hatte, bekommt ab jetzt diese Hinweisseite -- nicht stillschweigend + nichts. WARUM DIESE ENTSCHEIDUNG IN EINER EIGENEN DATEI STEHT: Sie hat zwei Stellen, an denen ein Denkfehler teuer waere, und beide sieht man einer Bedingung nicht an: - 1. Derselbe Dienst bedient BEIDE Adressen. Wer nicht auf den Host - prueft, baut eine Endlosschleife -- die neue Adresse wuerde sich - immer wieder auf sich selbst weiterleiten, und der Workspace waere - fuer alle unerreichbar. + 1. DIE NEUE ADRESSE DARF NIE BETROFFEN SEIN. Derselbe Dienst bedient + beide. Wer nicht auf den Hostnamen prueft, sperrt den Workspace + fuer alle aus -- sofort nach dem Neustart und ohne Vorwarnung. - 2. "faengt an mit /workspace" trifft auch /workspaceXYZ. Ein solcher - Pfad gehoert nicht zum Workspace und darf nicht umgeleitet werden. + 2. "faengt an mit /workspace" trifft auch /workspaceXYZ und + /workspace-alt. Solche Pfade gehoeren nicht dazu. - Als eigene Funktion laesst sich beides pruefen, ohne den ganzen Server - zu starten -- siehe pruef-workspace-umzug.mjs. + Als eigene Funktion ist beides pruefbar, ohne den Server zu starten -- + siehe pruef-workspace-umzug.mjs. ===================================================================== */ export const NEUE_ADRESSE = "https://workspace.dogfather-universe.com"; -/** Die alten Adressen, von denen weitergeleitet wird. Bewusst eine feste - * Liste und kein Muster: Ein Muster wie /dogfather-universe\.com$/ wuerde - * auch auf workspace.dogfather-universe.com passen -- und damit genau die - * Endlosschleife bauen, die es zu vermeiden gilt. */ +/** Die alten Adressen. Bewusst eine feste Liste und kein Muster: Ein + * Muster wie /dogfather-universe\.com$/ wuerde auch auf + * workspace.dogfather-universe.com passen -- und damit genau die neue + * Adresse abschalten, die es zu schuetzen gilt. */ const ALTE_HOSTS = new Set(["dogfather-universe.com", "www.dogfather-universe.com"]); /** - * Soll diese Anfrage auf die neue Adresse umgeleitet werden? + * Ist das eine Anfrage an den ABGESCHALTETEN alten Ort des Workspace? * @param {string} hostKopfzeile Inhalt des Host-Kopffeldes, ggf. mit Port * @param {string} pfad req.path, also ohne Abfrageteil */ -export function sollUmgeleitetWerden(hostKopfzeile, pfad) { +export function istAlteWorkspaceAdresse(hostKopfzeile, pfad) { const host = String(hostKopfzeile || "").toLowerCase().split(":")[0]; if (!ALTE_HOSTS.has(host)) return false; /* Genau "/workspace" oder alles darunter -- aber NICHT /workspaceXYZ. */ return pfad === "/workspace" || pfad.startsWith("/workspace/"); } -/** Express-Zwischenschritt. Bewusst 302 (voruebergehend) statt 301: - * Ein 301 wird vom Browser dauerhaft gemerkt und laesst sich praktisch - * nicht zurueckholen -- waere an der Umleitung etwas falsch, waere die - * alte Adresse fuer jeden, der sie einmal aufgerufen hat, dauerhaft - * unbrauchbar, auch nach einer Korrektur. */ +/* Kurze Seite statt einer nackten Fehlermeldung. Wer hier landet, hat + einen alten Link oder eine alte Verknuepfung -- er soll erfahren, wohin + der Workspace gezogen ist, statt vor einem leeren Fenster zu sitzen. + Bewusst ohne Verweis zum Anklicken: Die Adresse steht zum Lesen da, + damit niemand aus Versehen ein neues Lesezeichen auf den alten Weg + setzt. Augenschonend dunkel wie der Rest der Seite. */ +const HINWEIS = ` + + + +Umgezogen · Creator Workspace + +
+

Der Creator Workspace ist umgezogen

+

Diese Adresse gibt es nicht mehr. Der Workspace hat jetzt eine eigene + Adresse — dadurch lässt er sich als richtige App installieren.

+

Bitte künftig hier anmelden:

+
workspace.dogfather-universe.com
+
`; + +/** Express-Zwischenschritt: beantwortet die alte Adresse mit 410 Gone. */ export function workspaceUmzug(req, res, next) { - if (sollUmgeleitetWerden(req.get("host"), req.path)) { - return res.redirect(302, NEUE_ADRESSE + req.originalUrl); + if (istAlteWorkspaceAdresse(req.get("host"), req.path)) { + /* Schnittstellen-Aufrufe bekommen JSON, keine HTML-Seite -- sonst + versucht ein alter, noch offener Browser-Tab die Hinweisseite als + Daten zu lesen und zeigt einen unverstaendlichen Fehler. */ + if (req.path.startsWith("/workspace/api/")) { + return res.status(410).json({ fehler: "umgezogen", neueAdresse: NEUE_ADRESSE }); + } + return res.status(410).type("html").send(HINWEIS); } next(); }