ThomasP: mod_rewrite - ein paar grundsätzliche Fragen

Hallo!

Ich möchte gerne meine Website suchmaschinenfreundlicher gestalten und habe mich deshalb ein wenig mit dem Apache-Modul mod_rewrite beschäftigt. Leider komme ich damit irgendwie nicht weiter ... und bei meinem erfolglosen Versuchen sind ein paar Fragen aufgetaucht:

  1. reicht es in der Datei .htaccess "RewriteEngine On" zu schreiben, wenn das Rewrite-Modul installiert ist, oder muß dazu auch der Server neu gestartet werden?

  2. Wofür ist eigentlich die RewriteCond? Die RewriteRule ist mir klar, aber die Condition? Wozu? Weder meine beiden Apache-Bücher, die ich mir ausgeborgt habe, noch längeres Stöbern im Archiv konnten mir diese Frage beantworten.

  3. Folgendes habe ich ausprobiert:
    RewriteRule ^test/(.*)/(.*)/(.*).html ^test/$3.php?$1=$2
    Das sollte eigentlich bewirken, daß man einen Parameter im Pfad übergeben kann, also aus test/id/10/show.html sollte test/show.php?id=10 werden. Da der Server aber antwortet, daß er die Datei "test/id/10/show.html" nicht finden kann, nehme ich an, daß die RewriteEngine überhaupt nicht greift.

Ich hoffe, daß ich mein Problem ausreichend beschrieben habe, und danke Euch schonmal im Voraus für Eure Tips!

Viele Grüße

Thomas.

    1. reicht es in der Datei .htaccess "RewriteEngine On" zu schreiben, wenn das Rewrite-Modul installiert ist, oder muß dazu auch der Server neu gestartet werden?

    Ja, das reicht. Die .htaccess wird bei jeder Anfrage vom Server neu gelesen und somit sind auch die Einstellungen in diesen Dateien quasi sofort aktiv.

    1. Wofür ist eigentlich die RewriteCond? Die RewriteRule ist mir klar, aber die Condition? Wozu? Weder meine beiden Apache-Bücher, die ich mir ausgeborgt habe, noch längeres Stöbern im Archiv konnten mir diese Frage beantworten.

    cond -> condition = Bedingung.

    http://httpd.apache.org/docs/mod/mod_rewrite.html#RewriteCond:
    "The RewriteCond directive defines a rule condition. Precede a RewriteRule directive with one or more RewriteCond directives. The following rewriting rule is only used if its pattern matches the current state of the URI and if these additional conditions apply too. "

    Auf Deutsch: RewriteRule ist zum _Ändern_ der URI da, mit RewriteCond legst Du fest, _ob_ die URI überhaupt geändert werden soll. Jeder Block aus RewriteCond-Anweisungen gehört dabei zu der jeweils darauf folgenden RewriteRule-Anweisung.

    1. Folgendes habe ich ausprobiert:
      RewriteRule ^test/(.*)/(.*)/(.*).html ^test/$3.php?$1=$2
      Das sollte eigentlich bewirken, daß man einen Parameter im Pfad übergeben kann, also aus test/id/10/show.html sollte test/show.php?id=10 werden. Da der Server aber antwortet, daß er die Datei "test/id/10/show.html" nicht finden kann, nehme ich an, daß die RewriteEngine überhaupt nicht greift.

    Also im zweiten Teil ist IMHO schonmal garantiert das ^ am Anfang zuviel. Dazu kommt noch, daß die $n-Dinger bei 0 anfangen, nicht bei 1.
    Probier mal etwas in der Richtung

    RewriteRule ^/test/(.*)/(.*)/(.*).html$ /test/$2.php?$0=$1

    Das gilt aber nur, wenn /test im Basisverzeichnis liegt, also unter "http://deine.domain.de/test/" zu erreichen ist und diese .htaccess, unter "http://deine.domain.de/.htaccess" (ortsmäßig meine ich, daß sie dort nicht per Browser abrufbar sein muß und darf, ist klar).
    Andernfalls mußt Du wohl mit RewriteBase arbeiten. Schau Dir nochmal die Beispiele in der Anleitung unter http://httpd.apache.org/docs/mod/mod_rewrite.html#RewriteRule an.

    Davon abgesehen: Wenn Du schon dabei bist, solltest Du vielleicht die Adressen nicht nur maschinen-, sondern auch gleich menschenfreundlich machen. "test/id/10/show.html" kann ich mir nicht merken, "test/artikel/10" schon viel besser.

    Gruß,
    soenk.e

    1. Hallo!

      Vielen Dank für Deine Antwort! Hast mich auf jeden Fall schon um ein ganzes Stückchen schlauer gemacht :-)

      1. Wofür ist eigentlich die RewriteCond? Die RewriteRule ist mir klar, aber die Condition? Wozu? Weder meine beiden Apache-Bücher, die ich mir ausgeborgt habe, noch längeres Stöbern im Archiv konnten mir diese Frage beantworten.

      cond -> condition = Bedingung.

      Ja, soweit hatte ich es auch verstanden, aber was genau wußte ich nicht. Jetzt bin ich der Wahrheit auf jeden Fall schonmal näher.

      Auf Deutsch: RewriteRule ist zum _Ändern_ der URI da, mit RewriteCond legst Du fest, _ob_ die URI überhaupt geändert werden soll. Jeder Block aus RewriteCond-Anweisungen gehört dabei zu der jeweils darauf folgenden RewriteRule-Anweisung.

      Schätze mal, das bringt vor allem in Sachen Performance was, wenn man diese Rules anwendet, oder? Also so, daß nicht in jedem Fall der reguläre Ausdruck ausgewertet werden muß, oder?

      1. Folgendes habe ich ausprobiert:
        RewriteRule ^test/(.*)/(.*)/(.*).html ^test/$3.php?$1=$2
        Das sollte eigentlich bewirken, daß man einen Parameter im Pfad übergeben kann, also aus test/id/10/show.html sollte test/show.php?id=10 werden. Da der Server aber antwortet, daß er die Datei "test/id/10/show.html" nicht finden kann, nehme ich an, daß die RewriteEngine überhaupt nicht greift.

      Also im zweiten Teil ist IMHO schonmal garantiert das ^ am Anfang zuviel.

      Ja,stimmt. War ein Tippfehler. In meiner Bedingung in .htaccess war das gar nicht drinnen :-)

      Dazu kommt noch, daß die $n-Dinger bei 0 anfangen, nicht bei 1.

      Ah ja. Gut. Das war mir nicht klar :-)

      Probier mal etwas in der Richtung
      RewriteRule ^/test/(.*)/(.*)/(.*).html$ /test/$2.php?$0=$1

      Blöderweise geht das nicht :-(

      Das gilt aber nur, wenn /test im Basisverzeichnis liegt, also unter "http://deine.domain.de/test/" zu erreichen ist und diese .htaccess, unter "http://deine.domain.de/.htaccess" (ortsmäßig meine ich, daß sie dort nicht per Browser abrufbar sein muß und darf, ist klar).

      Also ich habe das getestet. Wenn ich die Datei aufrufen möchte, dann kommt: You don't have permission to access /.htaccess on this server.
      Sollte also passen, hm?!

      Davon abgesehen: Wenn Du schon dabei bist, solltest Du vielleicht die Adressen nicht nur maschinen-, sondern auch gleich menschenfreundlich machen. "test/id/10/show.html" kann ich mir nicht merken, "test/artikel/10" schon viel besser.

      Ja, da hast Du auf jeden Fall recht, jedoch sind diese URLs nicht dafür gedacht, sie per Hand einzugeben, sondern nur Links von der Navigationsleiste zu den einzelnen Seite im Hauptframe. Wenn sich jemand einbildet, die von Hand eingeben zu müssen, dann soll er sich die auch merken :-)

      viele Grüße und Danke erstmal

      Thomas.

      1. Auf Deutsch: RewriteRule ist zum _Ändern_ der URI da, mit RewriteCond legst Du fest, _ob_ die URI überhaupt geändert werden soll. Jeder Block aus RewriteCond-Anweisungen gehört dabei zu der jeweils darauf folgenden RewriteRule-Anweisung.

        Schätze mal, das bringt vor allem in Sachen Performance was, wenn man diese Rules anwendet, oder? Also so, daß nicht in jedem Fall der reguläre Ausdruck ausgewertet werden muß, oder?

        Nein. RewriteRule wird auf jeden Fall "angetestet", wenn das Muster passt, werden die Bedingungen in RewriteCond geprüft. Mit RewriteCond kannst Du noch eine ganze Menge mehr testen, als nur die Adresse. Siehe Anleitung.

        Probier mal etwas in der Richtung
        RewriteRule ^/test/(.*)/(.*)/(.*).html$ /test/$2.php?$0=$1

        Blöderweise geht das nicht :-(

        Tja, da hilft wohl nur noch, hinten ein [R,L] ranzuhängen und ein wenig rumzuprobieren. Das R sollte bewirken, daß Dein Browser die neue Adresse in seiner Adressleiste anzeigt. Du kannst also prüfen, was mod_rewrite aus einer eingebenen Adresse macht und dann entsprechend rantasten.
        Vielleicht fängst Du auch einfach erstmal mit ^/(.*)$ an und baust das dann Stück für Stück aus. Wie heißt es so schön: Probieren geht über studieren :)

        Gruß,
        soenk.e