lighttpdapache: mod rewrite Apache -> Lighttpd

Hey.

Wie setze ich folgendes:

1. Es soll imemr gecheckt werden ob die Datei vorhanden ist
2. Aus www.example.com wird example.com
3. es soll immer auf die index.php im Root-Verzeichnis geleitet werden

in Lighttpd um?

Bei Apache sieht das so aus:
RewriteBase  /
RewriteCond %{HTTP_HOST} ^www.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
RewriteCond   %{REQUEST_FILENAME}    !-d
RewriteCond   %{REQUEST_FILENAME}    !-f
RewriteRule   .*                     index.php [L]

Bei Lighttpd könnte es ja "theoretisch" so aussehen:

url.rewrite-once = (
  "%{HTTP_HOST}"              => "^www.(.+)$ [NC]",
  "^(.*)$"                    => "http://%1/$1 [R=301,L]",
  "%{REQUEST_FILENAME}"       => "!-d",
  "%{REQUEST_FILENAME}"       => "!-f",
  ".*"                        => "index.php [L]"
)

Ich weiß aber ehrlich gesagt nicht weiter wie es richtig aussehen soll.
Lg lighttpapachefreak

  1. so etwas wie [NC] kennt lighttpd nicht, genausowenig einen Check, ob die Datei vorhanden ist. Nicht vorhandene Dateien gehen automatisch auf Error 404.

    Du solltest unbedingt die lighttpd-Doku zu mod_rewrite lesen. Dann würde Dir klar, dass die Environment-Variablen nicht im gleichen Maße gesetzt sind, sondern Du aus der vorhandenen URL mit einer RegExp herausparsen musst.

    Außerdem willst Du für die Umleitung von www.xy auf xy einen redirect, keinen Rewrite. Nur weil Apache das durcheinanderschmeißt, brauchts Du bei lighttpd trotzdem beide Module:

    $HTTP["host"] =~ "^www.(.*)$" {
      url.redirect = ( "^/(.*)" => "http://%1/$1" )
    }
    $HTTP["url"] !~ "^index.php" {
      url.rewrite-once = ( "^([^?]+)(?(.*))?" => "index.php?filename=$1&$3" )
    }

    Leider kann in lighttpd keine Variablen ins environment packen, so dass Du nicht mehr REQUEST_FILENAME, sondern $_GET['filename'] nehmen musst.

    Gruß, LX

    --
    RFC 1925, Satz 2: Egal, wie fest man schiebt, ganz gleich, wie hoch die Priorität ist, man kann die Lichtgeschwindigkeit nicht erhöhen.
    1. Außerdem willst Du für die Umleitung von www.xy auf xy einen redirect, keinen Rewrite. Nur weil Apache das durcheinanderschmeißt, brauchts Du bei lighttpd trotzdem beide Module:

      Okay, klingt logisch.

      $HTTP["host"] =~ "^www.(.*)$" {
        url.redirect = ( "^/(.*)" => "http://%1/$1" )
      }
      $HTTP["url"] !~ "^index.php" {
        url.rewrite-once = ( "^([^?]+)(?(.*))?" => "index.php?filename=$1&$3" )
      }

      Funktioniert leider nicht. Keine Fehlermeldung im Errorlog aber sobald ich example.com/foo oder /foo/bar eingebe: 404 - Not Found

      Danke und Gruß,
      lighttpdapache

      1. Okay, klingt logisch.

        $HTTP["host"] =~ "^www.(.*)$" {
          url.redirect = ( "^/(.*)" => "http://%1/$1" )
        }
        $HTTP["url"] !~ "^index.php" {
          url.rewrite-once = ( "^([^?]+)(?(.*))?" => "index.php?filename=$1&$3" )
        }

        Das geht alles noch etwas besser:

        $HTTP["host"] =~ "^www.(.*)$" {
          url.redirect = ( "^/(.*)" => "http://%1/$1" )
        }

        url.rewrite-if-not-file = (
                "^/(.+)/?$" => "/index.php/$1"
        )

        So - das ist denke ich was du willst.
        www wird auf "ohne www" umgeleitet, die URL wird _nur dann_ umgeschrieben "if-not-file", sprich nur wenn die Datei nicht existiert und alles wird auf index.php weitergeleitet.
        Dort kannst du dann die URL über REQUEST_URI auseinandernehen (:

        Liebe Grüße,
        Philipp Zentner