RSFiles!: Fehlende Datei erzeugt HTTP 500 statt 404 – kleiner Joomla-Patch
Bei einer Joomla-Installation mit RSFiles! fiel nach einer Bereinigung auf, dass Links auf nicht mehr vorhandene Dateien keinen normalen HTTP-404-Fehler zurückgaben.
Stattdessen antwortete die Seite mit:
HTTP 500 Internal Server Error
Das ist ungünstig, weil eine nicht vorhandene Ressource semantisch kein Serverfehler ist. Für Browser, Suchmaschinen und Monitoring sollte eine nicht mehr existierende Datei mit HTTP 404 Not Found beantwortet werden.
In meinem Fall ließ sich das mit einem sehr kleinen Patch beheben.
Betroffene Datei
Der Fehler trat in folgender RSFiles-Datei auf:
components/com_rsfiles/views/rsfiles/view.html.php
Dort wird zunächst versucht, die angeforderte Datei zu laden:
$this->file = $this->get('File');
Wenn weder ein passender Datenbankeintrag noch eine physische Datei vorhanden war, lieferte das Model false zurück.
Die Verarbeitung lief anschließend jedoch weiter.
Später landete der Fehler in der allgemeinen RSFiles-Fehlerbehandlung, die in dieser Konstellation eine Exception mit HTTP-Status 500 erzeugte.
Damit wurde aus einer simplen „Datei existiert nicht“-Situation ein interner Serverfehler.
Der Patch
Direkt nach:
$this->file = $this->get('File');
habe ich folgende Prüfung eingefügt:
// Return a proper 404 for missing files
if (empty($this->file)) {
throw new Exception(Text::_('COM_RSFILES_CANNOT_FIND_FILE'), 404);
}
Damit wird eine nicht vorhandene RSFiles-Ressource unmittelbar als HTTP 404 behandelt.
Vorher sichern
Vor Änderungen an Erweiterungsdateien sollte die Originaldatei gesichert werden.
Zum Beispiel:
cp -a \
components/com_rsfiles/views/rsfiles/view.html.php \
/root/rsfiles-view.html.php-before-404
Anschließend kann der Patch in die Live-Datei eingefügt werden.
PHP-Syntax prüfen
Nach der Änderung sollte die Datei unbedingt auf Syntaxfehler geprüft werden.
In meinem Setup mit Plesk und PHP 8.2:
/opt/plesk/php/8.2/bin/php -l \
components/com_rsfiles/views/rsfiles/view.html.php
Erwartetes Ergebnis:
No syntax errors detected
Test
Anschließend habe ich bewusst nicht vorhandene RSFiles-Pfade aufgerufen.
Vor dem Patch:
HTTP 500
Nach dem Patch:
HTTP 404
Unter anderem wurden ein frei erfundener Dateiname sowie eine zuvor entfernte verdächtige Datei getestet.
Die Joomla-Startseite lieferte gleichzeitig weiterhin:
HTTP 200
Damit war sichergestellt, dass nicht versehentlich eine allgemeine Fehlerbehandlung beschädigt worden war.
Warum das relevant ist
Der Unterschied zwischen 404 und 500 ist nicht nur kosmetisch.
HTTP 404
bedeutet:
Die angeforderte Ressource existiert nicht.
Das ist bei einer gelöschten oder unbekannten Datei korrekt.
HTTP 500
bedeutet:
Bei der Verarbeitung auf dem Server ist ein interner Fehler aufgetreten.
Das suggeriert einen Defekt der Anwendung oder des Servers.
Gerade nach einem Sicherheitsvorfall kann das relevant sein, wenn Suchmaschinen noch URLs zu inzwischen entfernten Dateien kennen.
Ein sauberer HTTP-404-Status signalisiert dann:
Diese Ressource ist nicht mehr vorhanden.
Wichtig: Updatefest ist der Patch nicht
Die Änderung liegt direkt in einer RSFiles-Komponentendatei:
components/com_rsfiles/views/rsfiles/view.html.php
Ein späteres RSFiles-Update kann diese Datei überschreiben.
Deshalb sollte der Patch dokumentiert und nach Updates kontrolliert werden.
Idealerweise sollte ein solcher Fall natürlich direkt in der Erweiterung selbst korrekt behandelt werden. Ein lokaler Patch ist vor allem dann sinnvoll, wenn kurzfristig ein sauberes HTTP-Verhalten benötigt wird.
Kurzfassung
Problem
Nicht vorhandene RSFiles-Dateien erzeugten:
HTTP 500
Ursache
Das RSFiles-Model lieferte bei einer fehlenden Datei false, die View behandelte diesen Zustand aber nicht unmittelbar als „nicht gefunden“.
Patch
Direkt nach:
$this->file = $this->get('File');
einfügen:
if (empty($this->file)) {
throw new Exception(Text::_('COM_RSFILES_CANNOT_FIND_FILE'), 404);
}
Ergebnis
Fehlende Dateien liefern anschließend korrekt:
HTTP 404
statt:
HTTP 500
Hinweis: Der Patch wurde an einer konkreten RSFiles-Installation getestet. Vor Änderungen sollte die betroffene Datei gesichert und nach jedem RSFiles-Update geprüft werden, ob die Anpassung noch notwendig ist.