feat(links): Mehrteilige Slugs und erhaltene Gross-/Kleinschreibung
Wer bereits gedruckte QR-Codes aus einem anderen System uebernimmt, kann deren Adressen nicht mehr aendern. Sehen die aus wie "/g/1AEJ0X90ZmF", waren sie hier bisher nicht abbildbar: der Normalisierer machte daraus "g-1aej0x90zmf" - Schraegstrich zu Bindestrich, alles klein. Der Kurzlink zeigte damit ins Leere. Ein Slug darf jetzt mehrere durch "/" getrennte Abschnitte haben (hoechstens acht, je 64 Zeichen) und behaelt die eingegebene Schreibweise. Erlaubt sind Buchstaben, Ziffern, Bindestrich, Unterstrich und Punkt; jeder Abschnitt muss mit einem Buchstaben oder einer Ziffer beginnen und enden. Umlaute und Leerzeichen werden weiterhin umgeschrieben. Wird versehentlich eine komplette URL eingefuegt, bleibt davon nur der Pfad uebrig. Damit die Verwaltung nicht verdeckt werden kann, greift die Liste reservierter Namen jetzt auf den ERSTEN Abschnitt: "admin/geheim" wird ebenso abgelehnt wie "admin". Die Route der Weiterleitung steht weiterhin ganz am Ende, alle Verwaltungsrouten gewinnen davor. Bei der Eindeutigkeit gilt bewusst das Gegenteil: sie wird OHNE Ruecksicht auf Gross- und Kleinschreibung geprueft. "Messe" und "messe" koennen auf derselben Domain nicht nebeneinander bestehen - an einer gedruckten Adresse waere sonst nicht mehr erkennbar, welcher Link gemeint ist. Ausserdem wuerde MySQL sie je nach Kollation ohnehin als gleich ansehen, SQLite nicht; so verhalten sich beide Treiber wieder gleich. Beim Aufruf wird zuerst exakt gesucht und nur bei einem Fehlschlag ohne Ruecksicht auf die Schreibweise - abgetippte Codes stimmen nicht immer. Weil die Eindeutigkeit oben schon ohne Ruecksicht geprueft wurde, kann dieser zweite Versuch nie mehrdeutig sein. Geprueft in beiden Betriebsarten: im Container und in der Shared-Hosting-Variante, bei der die Root-.htaccess nach public/ umleitet - dort sind mehrteilige Pfade der wahrscheinlichste Stolperstein.
This commit is contained in:
@@ -34,6 +34,8 @@ Benutzername und Passwort.
|
||||
- Lange URL eintragen → Kurzlink erzeugen
|
||||
- Zufälliger Slug (kollisionssicher, 7 Zeichen, wächst bei Kollisionen automatisch)
|
||||
oder eigener Wunsch-Slug wie `deine-domain.de/messe2026`
|
||||
- Mehrteilige Slugs mit Schrägstrich (`g/1AEJ0X90ZmF`) und erhaltener Groß-/Kleinschreibung –
|
||||
damit lassen sich bereits gedruckte QR-Codes aus einem anderen System übernehmen
|
||||
- URL-Validierung: ausschließlich `http` und `https` – innerhalb davon aber großzügig
|
||||
(Umlaut-Domains, Umlaute in Pfad/Query, IPv6, interne Hostnamen ohne Punkt)
|
||||
- Weiterleitung per HTTP 301/302/307/308 (konfigurierbar)
|
||||
@@ -394,9 +396,31 @@ Beim ersten Aufruf erscheint der Setup-Assistent (sofern kein
|
||||
Hostname nach Punycode gewandelt (`müller.de` → `xn--mller-kva.de`), weil HTTP-Header laut
|
||||
RFC 7230 ASCII sein müssen. Pfad und Query werden beim Speichern prozentkodiert, ohne
|
||||
bereits kodierte Sequenzen ein zweites Mal zu kodieren.
|
||||
- **Wunsch-Slug** – optional. Leer lassen für einen zufälligen Slug. Eingaben werden
|
||||
normalisiert (Großbuchstaben und Umlaute werden umgesetzt, Sonderzeichen zu
|
||||
Bindestrichen) und auf Eindeutigkeit geprüft.
|
||||
- **Wunsch-Slug** – optional. Leer lassen für einen zufälligen Slug.
|
||||
|
||||
Erlaubt sind Buchstaben, Ziffern, Bindestrich, Unterstrich und Punkt. Der
|
||||
**Schrägstrich trennt Abschnitte**, sodass sich auch mehrteilige Adressen abbilden
|
||||
lassen:
|
||||
|
||||
| Eingabe | Ergebnis |
|
||||
|---|---|
|
||||
| `messe2026` | `deine-domain.de/messe2026` |
|
||||
| `g/1AEJ0X90ZmF` | `deine-domain.de/g/1AEJ0X90ZmF` |
|
||||
| `Flyer2026/Halle-3` | `deine-domain.de/Flyer2026/Halle-3` |
|
||||
| `https://alt.de/g/ABC` | wird auf `g/ABC` reduziert |
|
||||
|
||||
**Groß- und Kleinschreibung bleibt erhalten.** Das ist wichtig, um bereits gedruckte
|
||||
QR-Codes aus einem anderen System zu übernehmen – deren Pfade lassen sich
|
||||
nachträglich nicht mehr ändern. Beim *Aufruf* wird die Schreibweise zusätzlich ohne
|
||||
Beachtung erkannt, falls jemand den Code abtippt.
|
||||
|
||||
Zwei Links, die sich **nur** in der Schreibweise unterscheiden, sind auf derselben
|
||||
Domain nicht möglich (`Messe` und `messe` schließen sich aus) – sonst wäre an einer
|
||||
gedruckten Adresse nicht mehr erkennbar, welcher gemeint ist.
|
||||
|
||||
Umlaute und Leerzeichen werden weiterhin umgeschrieben (`Grüße 2026` → `Gruesse-2026`).
|
||||
Der erste Abschnitt darf nicht `admin`, `login`, `assets`, `.well-known` usw. lauten,
|
||||
damit die Verwaltung nicht verdeckt wird.
|
||||
- **Interne Bezeichnung** – nur zur eigenen Orientierung, nirgends öffentlich.
|
||||
- **Aktiv** – deaktivierte Links liefern die 404-Seite, behalten aber ihre Statistik.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user