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.