CakePHP und lighttpd

2010-03-15 - kostaki

Die von CakePHP mitgelieferten htaccess Dateien funktionieren auf einem lighttpd Server natürlich nicht, da lighttpd keine htaccess Dateien unterstützt. Wer trotzdem die Pretty URLs von CakePHP benutzen möchte hat 2 Möglichkeiten. Die erste ist eine mod_rewrite (das von lighttpd natürlich) Lösung, die einfach und schnell eingerichtet ist, aber dafür etwas aufwändiger zu managen ist oder man benutzt ein LUA Script mit mod_magnet. Das Problem ist das lighttpd keinen Ersatz für die Apache Funktionen file_exists/dir_exists hat.

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

Bei den RewriteCond's wird geprüft ob das angefragte Verzeichnis oder die angefragte Datei nicht vorhanden ist und wenn beides zutreffen, wird die Anfrage an CakePHP übergeben. Die mod_rewrite Lösung ist deshalb aufwändiger zu managen, da man jede Datei/jedes Verzeichnis das man in die webroot packt und das man natürlich nicht per CakePHP managen will, von Hand in die rewrite Rule eintragen muss. Wem dies nichts ausmacht, für den ist die lighttpd mod_rewrite Lösung genau die richtige. Für alle anderen wäre das LUA Script besser geeignet, da es die benötigten Funktionen file_exists/dir_exists nachbildet und man sich so nicht mehr um die neuen Dateien/Verzeichnisse kümmern muss. Ich habe mich für die schlankere mod_rewrite Lösung entschieden, da mir die LUA Lösung schon als Overkill vorkommt.

Lösung 1 lighttpd und mod_rewrite

Als erstes sollte man mod_rewrite aktivieren, wenn es nicht schon läuft. Das Modul dazu einfach in der lighttpd.conf in das server.modules Array eintragen und den lighttpd Server reloaden.

$ nano /etc/lighttpd/lighttpd.conf
$ /etc/init.d/lighttpd force-reload
server.modules = (
    "mod_access",
    "mod_alias",
    "mod_accesslog",
    "mod_compress",
    "mod_rewrite"
)

Nun muss man seine vhost Konfiguration leicht anpassen.

$HTTP["host"] =~ "vhost\.config\.de" {
    server.document-root = "/var/www/cakephp/app/webroot/"
        
    url.rewrite = (
        "(index.php|test.php|favicon.ico)" => "/$1",
        "(css|files|img|js)/(.*)" => "/$1/$2",
        "^([^\?]*)(\?(.+))?$" => "/index.php?url=$1&$3",
    )
}

Der interessante Teil beginnt nach url.rewrite. In der ersten Zeile wird gesagt das Dateien mit dem Namen index.php, test.php und favicon.ico direkt aufgerufen werden. Hier kann man alle Dateien anhängen die direkt in der webroot liegen und die man statisch ausliefern möchte. In der zweiten Zeile sind die Verzeichnisse angegeben die statische Dateien enthalten und die man natürlich nicht per CakePHP processen lassen möchte. Alle Files in diesen Verzeichnissen werden also ohne CakePHP ausgeliefert. Die dritte Zeile ist die eigentliche RewriteRule, die alles was vorher nicht abgefangen wurde, an CakePHP weitergibt. Damit sind dann auch die Pretty URL's möglich.

Lösung 2 lighttpd. mod_magnet und LUA

Diese Lösung wird im CakePHP Book gut beschrieben.

Related Links

Leave a Reply