tl;dr: Problem war der .htaccess-Verzeichnisschutz, der verhindert, dass OXID korrekt prüfen kann, ob mod_rewrite funktioniert. Die Lösung ist den Schutz zu deaktivieren oder die Server-IP explizit zuzulassen.


Ich habe kürzlich einen OXID esales Shop installiert. An sich ist das kein Hexenwerk, allerdings gab es ein hartnäckiges Problem: mod_rewrite wurde nicht erkannt bzw. als nicht aktiv markiert. In diversen Foren liest man nur, dass man einfach im Code (!) die Prüfung deaktivieren könne. Da es mir eigentlich fern liegt, als „Laie“ an fremdem Code zu frickeln, daher habe ich das Problem mal nachvollzogen.

Der OXID-Shop überprüft das Vorhandensein von mod_rewrite auf recht kreative Art und Weise. Der zugehörige Code steht in core/oxsysrequirements.php (ctrl+f checkModRewrite) Und zwar wird folgender Request an den Server gesendet:

http://<domain>/oxseo.php?mod_rewrite_module_is=off

Durch eine RewriteRule, die in der mitgelieferten .htaccess-Datei steht, wird der Request aber umgeschrieben:

RewriteCond %{REQUEST_URI} oxseo\.php$
RewriteCond %{QUERY_STRING} mod_rewrite_module_is=off
RewriteRule oxseo\.php$ oxseo.php?mod_rewrite_module_is=on [L]

Das aufgerufene Skript macht dabei nichts anderes als zu prüfen, wie der übergebene Parameter lautet (also ob korrekt umgeschrieben wurde) und anschließend entweder mod_rewrite_on oder mod_rewrite_off auszugeben.

Per Hand abgesetzt brachte der Request aber die korrekte Ausgabe. Der Fehler lag also irgendwo in der Kommunikation und war schnell gefunden: Ich hatte für das Aufsetzen eine Authentifizierung per .htaccess eingerichtet. Diese funkte jetzt dazwischen und beantwortete den Request von OXID mit einem 401. Da das dort nicht abgefangen wird, geht der Shop davon aus, dass mod_rewrite nicht korrekt arbeitet. Die Lösung sah einfach aus: Zusätzlich zu der Authentifizierung per Username und Passwort darf auch der Server selbst auf sich zugreifen:

Require group oxid
Require ip <IP des Servers>

Achtung: Die IP des Servers ist nur 127.0.0.1, wenn man den Shop per „localhost“ aufruft. In allen anderen Fällen wird die Adresse aus den DNS genommen und das ist meist die externe IP des Servers.

Nächster Beitrag Vorheriger Beitrag