Bei der Verwendung von der Magento-Erweiterung "Improved Navigation" von Amasty kann folgender Fehler auftreten: Bindet man die Filter auf einer CMS-Seite (z.B. als Einstiegsmöglichkeit auf der Startseite) ein, so führt die Anwahl eines Filters auf die Unterseite "/shopby" mit der jeweiligen Option als URL-Parameter. Dort erkennt der Controller jedoch keine Beteiligung der Amasty-Extension und versucht, eine CMS-Seite anzuzeigen. Nach einiger Recherche zeigt sich, dass Amasty hier (ohne Not) aus der URL "/shopby" die URL "/s" macht und diese dann nicht zugeordnet werden kann - die Anzeige der 404-Seite ist die Folge.
Dies liegt daran, dass in der Klasse "Amasty_Shopby_Helper_Url" (definiert in \app\code\local\Amasty\Shopby\Helper\Url.php) Veränderungen an der URL vorgenommen werden. Denn in der Funktion "checkRemoveSuffix($url)", in der eigentlich nur ein eventuell vorhandener Suffix (z.B. ".html") entfernt werden soll, läuft eine Überprüfungsfunktion in's Leere. Der Rückgabewert der PHP-Funktion
substr_compare($url, $suffix, -$l),
welcher hier mit "0" verglichen wird, ist bei fehlendem (und eigentlich optionalem) 4. Parameter $length, mit dem die Anzahl der zu vergleichenden Zeichen festgelegt wird, falsch. Denn dieser ist auch "0", wenn die zu vergleichenden Strings ungleich sind, so dass die zuvor korrekte URL dann zu einer falschen abgeändert wird, da die Zeichen von der Länge des im Backenend angegebene Suffix abgeschnitten werden. Da in unserem Falle ".html" eine Länge von 5 Zeichen hatte, wurden somit die letzten 5 Zeichen der UEL abgeschnitten, "/shopby" wurde ohne "hopby" zu "/s".
Nun stellte sich unserer Agentur die Frage nach dem "warum". Nach weiterer Recherche stießen wir auf 2 PHP-Bug-Reports:
https://bugs.php.net/bug.php?id=67069 und
https://bugs.php.net/bug.php?id=67043,
welche von Unregelmäßigkeiten der Funktion substr_compare in der PHP-Version 5.5.11 berichteten. Und wie es der Zufall will, lief auf unserem lokalen Server: PHP 5.5.11. Um weitere Fehlerquellen auszuschließen, änderten wir nun in der Magento-Extension (Dateiname siehe oben) die Zeile
substr_compare($url, $suffix, -$l)
zu
substr_compare($url, $suffix, -$l, $l)
Damit war das Problem behoben und der Magento-Shop konnte unter "/shopby" die korrekte Seite anzeigen. Getestet in Magento CE 1.9.