Die Sache hat mir jetzt keine Ruhe gelassen und meinen Jagdinstinkt geweckt
Und siehe da: Ich habe die „Fehlerquelle“ gefunden!
Der Code, der dieses Verhalten verursacht ist in der Datei
vendor\shopware\storefront\Framework\Routing\RequestTransformer.php > Zeile 223.
Die if-Abfrage fügt vor den baseUrlPath einen / ein, wenn der baseUrlPath länger als 1 Zeichen ist und nicht mit einem / beginnt. Und genau hier liegt das Problem. Denn das Sprachkürzel für meine englische Domain-URL lautet „e“ und ist damit nur 1 Zeichen lang (alle anderen Sprachkürzel waren bei mir 2 Zeichen lang). Deshalb springt das Programm hier nicht in die if-Abfrage rein und deshalb fehlt auch der / vor dem Pfad. Wenn ich den Code ändere, so dass >= 1 steht statt nur > 1, geht es wunderbar:
# if (\strlen($baseUrlPath) > 1 && strpos($baseUrlPath, '/') !== 0) {
if (\strlen($baseUrlPath) >= 1 && strpos($baseUrlPath, '/') !== 0) {
$baseUrlPath = '/' . $baseUrlPath;
}
Ich weiß allerdings nicht, warum sich der Entwickler dort für das > 1 entschieden hat - ob es eine bewusste Entscheidung war oder ob er das = nur vergessen hat. Soweit ich grob getestet habe, scheint eine Änderung in >= keine Probleme zu bereiten (ich habe aber mich aber wirklich nur grob durchgeklickt).
Warum der Language-Switch nur bei bestimmten Seiten-Typen nicht funktioniert hat liegt übrigens daran, dass dort das Programm nicht in die if-Abfrage in Zeile 216 springt:
if (isset($resolved['canonicalPathInfo'])) {
Wenn es sich um einen Fehler im Code handelt, könnte dieser also ggf. mit einem = behoben werden. Das müssten die Entwickler mal prüfen.
Wenn es einen Grund hat, warum es > und nicht >= heißt, sollte bei der Eingabe der Domain-URL im Adminbereich von Shopware erzwungen werden, dass der URL-Teil hinter dem letzten / aus mindestens 2 Zeichen besteht inkl. einem Hinweis, damit niemand mehr in dieses Problem rennt.