Tim93: Hilfe bei mod.rewrite-Modul

Hey Folks,

ich bräuchte mal Eure Hilfe zur Verwendung des mod.rewrite-Moduls.

Meine .htaccess-Datei sieht folgendermaßen aus:

RewriteEngine On  
RewriteCond %{REQUEST_FILENAME} !-f  
RewriteCond %{REQUEST_FILENAME} !-d  
RewriteRule ^(.*)$ /index.php?page_url=$1  
RewriteRule ^(.*)/$ /index.php?page_url=$1 [L]  

Meine Serverstruktur nun folgendermaßen:

Hauptordner
--> u15 (Ordner)
--> .htaccess (Datei)
--> index.php (Datei)

In der index.php lasse ich mir nun die Variable $page_url ausgeben. Das Ergebnis:

xyz.de/u15 --> "u15" (wird vom Server automatisch zur URL "xyz.de/u15/" mit abschließendem Slash umgewandelt)
xyz.de/impressum --> "impressum"
xyz.de/impressum/ --> "/index.php"

Problem also: Sobald an "impressum" ein "/" angehängt wird, gibt es einen Fehler - allerdings nur, wenn es den Ordner nicht gibt. Gibt es einen Ordner "u15", wird auch mit "u15/" und auch "u15//////////" "u15" ausgegeben.

Wie kriege ich es nun hin, dass trotz des angehängten Slashs an eine URL kein Fehler ausgegeben wird, sondern die richtige page_url?

Danke im Voraus und Gruß, Patrick

  1. Tach!

    Meine .htaccess-Datei sieht folgendermaßen aus:

    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.)$ /index.php?page_url=$1
    RewriteRule ^(.
    )/$ /index.php?page_url=$1 [L]

      
    RewriteConds gelten nur für die eine RewriteRule, vor der sie stehen.  
      
    
    > xyz.de/impressum/ --> "/index.php"  
      
    Die zweite Rule springt an. Dann gibt es einen internen Redirect, das passiert immer beim Rewriten. Nun hast du also aus dem /impressum/ ein /index.php?page\_url=impressum gemacht. Das wird nun von der ersten RewriteRule zu /index.php?page\_url=index.php umgeschrieben. Der Querystring ging verloren, der wird von der RewriteRule nicht berücksichtigt (aber mit QSA-Flag angehängt).  
      
    
    > Wie kriege ich es nun hin, dass trotz des angehängten Slashs an eine URL kein Fehler ausgegeben wird, sondern die richtige page\_url?  
      
    Ich würde alles mit  
      
      RewriteRule .\* /index.php  
      
    (und den beiden RewriteConds davor) umschreiben und im Script $\_SERVER['REQUEST\_URI'] auswerten.  
      
      
    dedlfix.
    
    1. Ich würde alles mit

      RewriteRule .* /index.php

      (und den beiden RewriteConds davor) umschreiben und im Script $_SERVER['REQUEST_URI'] auswerten.

      Wenn ich dann als URL "xyz.de/u15" aufrufe, wird der Zugriff vom Server verweigert: 403, Forbidden!

      Liegt doch auch daran, dass der Ordner "u15" existiert, oder?

      1. Tach!

        Ich würde alles mit
          RewriteRule .* /index.php
        (und den beiden RewriteConds davor) umschreiben und im Script $_SERVER['REQUEST_URI'] auswerten.
        Wenn ich dann als URL "xyz.de/u15" aufrufe, wird der Zugriff vom Server verweigert: 403, Forbidden!

        Alles was existiert wird ja durch die RewriteConds vom Umschreiben ausgenommen. Wenn du ein Forbidden bekommst, ist nicht die Rule dran schuld. Wenn du allerdings die eine genannte Rule ohne Conds genommen hast, dann wird nichts gescheites rauskommen.

        dedlfix.

  2. Hallo,

    Meine .htaccess-Datei sieht folgendermaßen aus:

    1  RewriteEngine On

    2  RewriteCond %{REQUEST_FILENAME} !-f
    3  RewriteCond %{REQUEST_FILENAME} !-d
    4  RewriteRule ^(.)$ /index.php?page_url=$1
    5  RewriteRule ^(.
    )/$ /index.php?page_url=$1 [L]

      
    ich habe mir erlaubt, die Zeilen zu numerieren - und ich ahne schon beim Ansehen dieser Direktiven, wo das Problem liegt.  
      
    
    > xyz.de/u15 --> "u15" (wird vom Server automatisch zur URL "xyz.de/u15/" mit abschließendem Slash umgewandelt)  
    > xyz.de/impressum --> "impressum"  
    > xyz.de/impressum/ --> "/index.php"  
      
    Ja, logisch. Der Pfad impressum/ mit abschließendem Slash passt ja auch auf das Muster ^(.\*)$ in Zeile 4: Anfang des Ausdrucks, dann beliebig viele beliebige Zeichen, dann Ende des Ausdrucks.  
      
    
    > Wie kriege ich es nun hin, dass trotz des angehängten Slashs an eine URL kein Fehler ausgegeben wird, sondern die richtige page\_url?  
      
    Ich würde Zeile 4 und 5 tauschen, so dass das Suchmuster mit Slash am Ende zuerst abgeprüft wird.  
      
    So long,  
     Martin  
      
      
    PS: Hat es einen Grund, dass du Apache-Code als HTML markierst?
    
    -- 
    Nicht jeder, der aus dem Rahmen fällt, war vorher im Bilde.  
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    
    1. Ich würde Zeile 4 und 5 tauschen, so dass das Suchmuster mit Slash am Ende zuerst abgeprüft wird.

      Das macht der Server nicht mit:

      The server encountered an internal error or misconfiguration and was unable to complete your request.
      More information about this error may be available in the server error log.
      Additionally, a 500 Internal Server Error error was encountered while trying to use an ErrorDocument to handle the request.

      Ans Error Log komme ich leider nicht. Die Fehlermeldung erscheint übrigens egal, welche URL ich eingebe, auch wenn es nur die Home-URL ohne Zusätze ist.

      PS: Hat es einen Grund, dass du Apache-Code als HTML markierst?

      Keinen Bestimmten, verklickt!