hilfe bei mod_rewrite regel aufstellen



  • Hallo!

    Könnte mir mal jemand bei meinem mod_rewrite helfen? Ich bekomm das auf die schnelle einfach nicht hin.

    Folgende Rules möchte ich realisieren:

    example.com/index.php?page=SEITENNAME -> example.com/SEITENNAME
    example.com/index.php?page=SEITENNAME&id=ZAHL -> example.com/SEITENNAME/ZAHL

    SEITENNAME kann dabei alle Buchstaben und Zahlen beinhalten.
    ZAHL natürliche Zahlen

    vielen Dank schonmal



  • Wie sieht denn dein Ansatz aus?

    Wenn du bei Google nach "mod_rewrite" suchst, dann ist das gleich das zweite Ergebnis eine Anleitung mit Beispielen, die ziemlich genau das machen, was du brauchst: http://www.google.com/search?q=mod_rewrite



  • Also die Seite hatte ich auch gefunden.
    Daraus habe ich mir dann das hier zusammengereimt.

    RewriteEngine on 
    RewriteRule  ^.*$ index.php?page=$1
    RewriteRule  ^.*$1/([0-9]+)$2 /index.php?page=$1&id=$2
    


  • Wubbel schrieb:

    Also die Seite hatte ich auch gefunden.
    Daraus habe ich mir dann das hier zusammengereimt.

    RewriteEngine on 
    RewriteRule  ^.*$ index.php?page=$1
    RewriteRule  ^.*$1/([0-9]+)$2 /index.php?page=$1&id=$2
    

    $1 sollte bei dir nur in der Ersetzung stehen, nicht im regulären Ausdruck, der links steht. Damit 1 einen gültigen Wert besitzt, musst du im regulären Ausdruck irgendetwas einklammern. Der reguläre Ausdruck ^.* hat nichts eingeklammert, also wird $1 leer sein. Außerdem erwischt dieser reguläre Ausdruck alles, also auch "www.example.com/a/b/c/". Du musst ausschließen, dass ein / in der URL auftaucht, damit der wirklich nur "www.example.com/seitenid" matcht.

    Du solltest dir vielleicht nochmal anschauen, wie reguläre Ausdrücke funktionieren, völlig unabhängig von mod_rewrite. Vor allem die Bedeutung von $ in einem regulären Ausdruck ist hier wichtig.

    edit: Außerdem ist natürlich ganz wichtig die folgende Seite: http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewriterule



  • Hey. Also ich habe mich inzwischen nochmal damit befasst. Und hab die Regeln jetzt einzeln ausgeschrieben. Das ist auch nicht schlimm, da es sowieso nicht viele sind.
    Allerdings habe ich mit einigen noch Probleme.

    RewriteEngine On
    RewriteBase /
    
    RewriteRule (konzerte)  /web/index.php?page=tours   [NC]
    RewriteRule (presse)    /web/index.php?page=press   [NC]
    RewriteRule (aktion)    /web/index.php?page=actions [NC]
    RewriteRule (jobs)      /web/index.php?page=jobs    [NC]
    RewriteRule (kontakt)   /web/index.php?page=imprint [NC]
    RewriteRule (impressum) /web/index.php?page=imprint [NC]
    
    #RewriteRule ^(bands)$           /web/index.php?page=bands    [NC]
    #RewriteRule ^(bands)/([0-9]+)$  /web/index.php?page=$1&id=$2 [NC]
    
    #RewriteRule (suche)             /web/index.php?page=$1       [NC]
    

    Die aukommentierten Regeln funktionieren noch nicht.

    (bands):
    Wenn ich example.com/bands aufrufe funktioniert alles prima.

    Wird dahinter eine ID mit Buchstaben oder nur Buchstaben aufgerufen, folgt ein 404 Fehler. Das ist soweit eigentlich auch in Ordnung.
    Beispiel:
    example.com/bands/9485bbb
    example.com/bands/ghj

    Wenn ich noch eine ID aufrufe, die in der DB existiert, funktioniert es.
    Rufe ich nun allerdings eine ID auf, die nicht in der DB ist, folgt ein Umleitungsfehler.

    Fehlermeldung aus dem Firefox schrieb:

    Fehler: Umleitungsfehler
    Die aufgerufene Website leitet die Anfrage so um, dass sie nie beendet werden kann.

    Ich weiß nicht wieso das passiert. Eigentlich werden nicht vorhandene ID's und ID's, die nicht numerisch sind abgefangen.

    (suche):
    Ich habe ein Suchformular, dass ich per POST bediene. Das gibt ja aber mit mod_rewrite sicherlich Probleme oder? Meine Frage ist jetzt, ob ich das Formulat auf GET ändern soll.



  • Warum schreibst du [NC] hinter alle deine Regeln? Das würde ich weglassen, URLs sind normalerweise nicht case-insensitive.

    POST-Formulare funktionieren auch mit mod_rewrite einwandfrei, denn der mod_rewrite-Redirect ist eine rein interne Sache. Der User bekommt davon gar nichts mit, außer du gibst deinen mod_rewrite-Regeln ein bestimmtes Flag (das Flag [R]).

    Zu deinem Problem mit der bands-URL: Vermutlich macht das php-Skript einen HTTP-redirect. mod_rewrite ändert vielleicht nur die URLs so, dass der Redirect endlos wird.


Log in to reply