papaya CMS: Backend auslagern und absichern 12.06.2010
An dieser Stelle möchte ich einen Tweak für das Content-Management-System papaya CMS vorstellen.
Generell wird empfohlen, den Ordner papaya-data und papaya-lib in einen Ordner außerhalb des Ordners der Ausgabeseiten zu legen. Doch was ist mit dem Ordner papaya, über den das Backend ereichbar ist? Kann man diesen Ordner nicht auslagern und absichern?
Diese Fragen habe ich mir vor einiger Zeit gestellt und habe nach Lösungen gesucht. Vorne weg, ich wurde fündig.
Ich notierte mir dazu zwei Anforderungen:
- Backend nur über eine seperate Sub-Domäne bereitstellen
- eine gesicherte Verbindung (https) für die Sub-Domäne erzwingen
Die erste Anforderung ließ sich leicht erfüllen. Den Ordner habe ich in ein anderes Verzeichnis verschoben und darauf eine Sub-Domäne eingerichtet. Zu diesem Zeitpunkt ahnte ich noch nichts Böses ;)
Für die zweite Anforderung musste ich etwas recherchieren. Es gibt zwar auch eine Option im papaya CMS Backend, diese garantiert jedoch nicht, dass die gesamte Sub-Domäne abgesichert ist. Eine solide Lösung fand ich über die Rewrite-Rules. Da der Ordner papaya noch keine .htaccess-Datei enthielt, musste ich eine neue anlegen.
Zum Absichern der gesamten Sub-Domäne reicht eine .htaccess Datei im Basisverzeichnis mit folgendem Inhalt:
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteCond %{REQUEST_FILENAME} !(ausnahme1.html|ausnahme2.php)
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Die dritte Zeile definiert Dateien, auf die diese Regel nicht zutreffen soll. Ich habe dort spezielle Dateien definiert, die von externen Diensten abgerufen werden. D.h. die Dateien ausnahme1.html und ausnahme2.php lassen sich in diesem Beispiel über http abrufen.
Für das Backend habe ich noch ein paar weitere Regeln aus der ursprünglichen papaya CMS htaccess übernommen.
Dabei habe ich die Ordnerangabe papaya bei Bedarf aus den Ordnerangaben entfernt.
#remove session id
RewriteRule ^/?sid[a-z]*([a-zA-Z0-9,-]{20,40})(/.*) $2 [QSA]
#admin pages
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/?module\_([a-z\d\_]+)\.[a-z]{3,4} /module.php?p_module=$1 [QSA,L]
Der erste Absatz kümmert sich um die SessionID-Angabe falls die Option PAPAYA_SESSION_ID_FALLBACK in den papaya CMS Einstellungen auf Path Rewrite gestellt wurde und sich die SessionID nicht in den Browsercookies abspeichern lässt.
Der zweite Absatz schreibt die Aufrufe zu den Backendmodulen um, wie z.B. module_edmodule_community.php.
An dieser Stelle dachte ich mir sei die Lösung schon perfekt. Ich konnte damit das Backend ansteuern, eine sichere Verbindung wurde sichergestellt und auch die Backendmodule ließen sich ansteuern.
Nur als ich die Vorschau einer Seite betrachten wollte, sah ich auf einmal das Backend. Ups!
Für die Vorschau musste eine Lösung her. Ich überlegte und stellte fest, dass ich nicht einfach das Frontend nutzen konnte, da die Backendsession auf der anderen Domäne nicht aktiv war.
Stattdessen legte ich einen Ordner content im Verzeichnis des Backends an, in diesem legte ich Kopien der Dateien index.php und die conf.inc.php ab (in neueren Versionen auch die Datei revision.inc.php). Daraufhin stellte ich in der conf.inc.php sicher, dass die Pfade PAPAYA_INCLUDE_PATH und PAPAYA_PATH_DATA korrekt gesetzt werden.
Zudem fügte ich eine Regel hinzu, dass eine Umleitung erfolgt, sobald dieses Frontend nicht im Vorschau-Modus aufgerufen wird:
if (strpos($_SERVER["REQUEST_URI"], '.preview') === FALSE) {
header('Location: http://backend.url/index.php');
exit;
}
Erneut versuchte ich danach die Vorschau einer Seite aufzurufen, doch eine Sache fehlte noch, ah die RewriteRules!
Für die Ausgabe des Frontends im Vorschau-Modus musste ich die htaccess-Datei noch um folgende Regeln aus der ursprünglichen papaya CMS htaccess ergänzen. Die Ordnerangaben ergäntze ich dabei um content bei Bedarf.
#media files - wrapper script
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/?([a-fA-F0-9]/)*[a-zA-Z0-9_-]+\.(media|thumb|download|popup|image)(\.(preview))?((\.([a-zA-Z0-9_]+))?(\.[a-zA-Z0-9_]+)) /content/index.php [QSA,L]
#output pages
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/?[a-zA-Z0-9_-]+((\.[0-9]+)?\.[0-9]+)((\.[a-z]{2,5})?\.[a-z]+)((\.[0-9]+)?.preview)? /content/index.php [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/?index((\.[a-z]{2,5})?\.[a-z]+)((\.[0-9]+)?.preview)? /content/index.php [QSA,L]
Der erste Absatz schreibt die Aufrufe der Mediendateien um, der zweite Absatz kümmert sich um die Seitenaufrufe.
Nach diesen Ergänzungen klappte auch die Vorschau.
Ich wünsche gutes Gelingen beim Konfigurieren, eine Vorlage für die htaccess-Datei gibt es hier.
Letzte Aktualisierung: 31.07.2010

