Bei unserem Kunden wurden keine Bilder in den Ordnern mit Umlauten und Leerzeichen generiert, in anderen Ordnern jedoch schon.
Da wir nicht bis zum entscheidenden Patch warten können, haben wir das Problem selber im
"includes/src/Router/Controller/MediaImageController.php" behoben. Wenn beim nächsten Update das Problem nicht gelöst wird, wird dieser Controller überschrieben und der Fix ist weg.
Falls es noch jemanden weiter hilft, hier die Beschreibung zum Fix. (Das Editieren der
Shop-includes sollte man unter normalen Umständen vermeiden, aber Geld verdient sich nicht von alleine
Fix: OPC Bilder werden in JTL-Shop 5.6.x nicht mehr generiert (Unterordner, Leerzeichen, Umlaute)
Problembeschreibung:
Seit dem Update auf JTL-Shop 5.6.x werden im OPC (OnPage Composer) hochgeladene Bilder im Frontend oft nicht mehr "on-the-fly" skaliert und als WebP/AVIF ausgeliefert. Im Quelltext steht zwar das <picture>-Tag mit dem Pfad zum media/image/opc Ordner, die physikalischen Bilddateien werden dort aber nicht erzeugt. Stattdessen gibt der Webserver für diese URLs einen 404-Fehler zurück.
Der Fehler tritt genau dann auf, wenn die Bilder im OPC-Editor in
Unterordnern gespeichert wurden oder der Pfad/Dateiname
Sonderzeichen, Leerzeichen oder Umlaute enthält (z. B. media/image/opc/sm/Onlineshop/Über Uns/bild1.jpg).
Ursache:
JTL-Shop 5.6 hat das Routing für die "On-the-fly" Bildgenerierung auf die Bibliothek FastRoute (via League\Route) umgestellt. Die Verarbeitung findet in der Datei includes/src/Router/Controller/MediaImageController.php statt.
Es gibt dort zwei miteinander verwobene Probleme:
- Regex-Regel für OPC-Pfade (register()):
Die FastRoute Regel für den Parameter $name
Code:
($name = '{name:[a-zA-Z0-9 äööüÄÖÜß\@\$\-\_\.\+\!\*\\\'\(\)\,]+}';)
- erlaubt standardmäßig weder Schrägstriche (/) noch Prozentzeichen (%). Da OPC-Bilder in Unterordnern liegen können, enthalten die Pfade Schrägstriche. Ebenso werden Leerzeichen und Umlaute im Browser URL-kodiert (z. B. %20, %C3...), wodurch logischerweise `%`-Zeichen in der URL landen. Da diese Zeichen in der Regex fehlen, lehnt der Router die Anfrage ab und wirft sofort einen 404-Error.
- Redirect-Loop durch fehlendes URL-Decodieren (getResponse()):
Selbst wenn man die Regex anpasst, knallt es anschließend in der Funktion getResponse(). Hier wird der physische Zielpfad des Bildes (der Umlaute/Leerzeichen enthält) strikt per === mit der angeforderten URL ($requestURL) verglichen. Da $requestURL un-decodiert ist (sie enthält `%20` etc.), schlägt der Vergleich fehl. Der MediaImageController initiiert daraufhin fälschlicherweise einen 301 Redirect auf denselben Pfad, was beim erneuten Aufruf durch den Browser zu einem endlosen Redirect-Loop führt. Der eigentliche Generierungscode (Image::render()) wird nie ausgeführt.
Der Bugfix im JTL-Core:
In der Datei includes/src/Router/Controller/MediaImageController.php müssen zwei Anpassungen vorgenommen werden.
Fix 1: FastRoute Regex anpassen (ab Zeile ~58)
Ersetze die Registrierung der OPC-Route so, dass eine eigene $nameOpc Variable verwendet wird, die \/ und \% erlaubt.
Vorher:
Code:
$route->get(
\sprintf('/media/image/{type:opc}/%s/%s.%s', $size, $name, $ext),
$this->getResponse(...)
)
->setName('mediaImageOPC' . $dynName);
Nachher:
Code:
$nameOpc = '{name:[a-zA-Z0-9 äööüÄÖÜß\@\$\-\_\.\+\!\*\\\'\(\)\,\/\%]+}';
$route->get(
\sprintf('/media/image/{type:opc}/%s/%s.%s', $size, $nameOpc, $ext),
$this->getResponse(...)
)
->setName('mediaImageOPC' . $dynName);
Fix 2: URL-Decoding einbauen (ab Zeile ~92)
In der Methode getResponse(...) muss $args['name'] und die $requestURL vor dem Pfad-Vergleich zwingend decodiert werden.
Füge nach der $args['number'] Prüfung folgendes ein:
Code:
if (isset($args['name'])) {
$args['name'] = \urldecode($args['name']);
}
Und ändere wenig später die Definition von $requestURL (ca. Zeile 98):
Vorher:
Code:
$requestURL = '/' . \ltrim($request->getUri()->getPath(), '/');
Nachher (urldecode hinzufügen):
Code:
$requestURL = \urldecode('/' . \ltrim($request->getUri()->getPath(), '/'));
Nach diesen Änderungen muss zwingend der
JTL Object Cache über das Shop Backend (oder per Konsolenbefehl) geleert werden, damit FastRoute die geänderten Routing-Regeln neu in seinen
Cache schreibt! Danach werden OPC Bilder aus Unterordnern und mit Umlauten im Namen wieder sofort erzeugt.
Umsetzung auf eigene Gefahr! Wer sich damit nicht auskennt, sollte lieber die Bilder-Ordner im OPC umbenennen (keine Leerzeichen und Sonderzeichen).