tomgk: Rewrite: Optional Verzeichnis/Dateiendung

Hallo!

Warum funktioniert das nicht?:
RewriteRule ^(^.*/)([^/]*)(..*)$ index.php?dir=$1&site=$2&typ=$3 [L]
Wenn man "dir/file.ext", "dir/.ext" oder "" (weil dann sowiso index.php aufgerufen wird) eingibt funktionierts ansonsten nicht.

404 bei
-"dir/file"
-"file.ext"
-"file" (ohne Dateiendung)
-".ext" (Nur Dateiendung)

Zur erklärung:
Im 1. soll der Verzeichnisname gespeichert werden, im 2. der Dateiname und im 3. die Dateiendung.

Würde man alle Möglichkeiten aufschreiben wären das 6 Kombinationen, also 6 Regeln.
Mir wäre lieber nur eine Regel die all das erfüllt.
Wo liegt der Fehler in der Rewrite-Regel?

MfG
tomgk

  1. Hallo!

    Hab jetzt die Regel fertig:
    RewriteRule ^(^.*/)([^/.]*)(.|)(.*)$ index.php?dir=$1&site=$2&typ=$4 [L]
    Stimmt sie oder gibts noch Fehler?

    MfG
    tomgk

    1. Hab jetzt die Regel fertig:
      RewriteRule ^(^.*/)([^/.]*)(.|)(.*)$ index.php?dir=$1&site=$2&typ=$4 [L]

      Warum du zwei Mal ^ - also Beginn der Zeichenkette - hintereinander notierst, wird mir nicht ganz klar.

      404 bei
      -"dir/file"

      Das dürfte wohl nicht erfüllt sein. Geht es eigentlich immer nur um eine Verzeichnisebene oder auch mehrere? Also foo/bar/file.ext

      ich würde da eher

      RewriteRule ^(.*/)(?:([^/.]*).([a-z]{2,4}))?$ index.php?dir=$1&site=$2&typ=$3 [L]

      nutzen (RegEx ab apache 2.0, sonst musst du ?: entfernen und die letzte backreference auf $4 ändern).

      Matched auf
      foo/.ext
      foo/bar.ext
      foo/

      (auch foo/bar/.ext etc.)

      1. Hallo!

        ich würde da eher

        RewriteRule ^(.*/)(?:([^/.]*).([a-z]{2,4}))?$ index.php?dir=$1&site=$2&typ=$3 [L]

        nutzen (RegEx ab apache 2.0, sonst musst du ?: entfernen und die letzte backreference auf $4 ändern).

        Das funktionier ja nur bei */*.* also nur mit Punkt und Slash, oder?
        Ich möchte es aber mit und ohne Punkt/Slash. (Was beteutet das "?:" ?)

        Hab eine andere Regel:
        RewriteRule ^(.*/|)([^/.]*)(.|)(.*)$ index.php?dir=$1&name=$2&typ=$4 [L]
        Ohne dem | funktionierts nicht. Gibts da bessere Vorschläge?

        MfG
        tomgk

        1. RewriteRule ^(.*/)(?:([^/.]*).([a-z]{2,4}))?$ index.php?dir=$1&site=$2&typ=$3 [L]

          Das funktionier ja nur bei */*.* also nur mit Punkt und Slash, oder?

          auch bei

          */*.*
          */.*
          */
           (s. oben).

          Ich möchte es aber mit und ohne Punkt/Slash. (Was beteutet das "?:" ?)

          Ein Fall ozhne Punkt/Slash ("file") soll doch gerade nach dem 1. Posting nicht passen?
          ?: -> es wird keine Backreference erstellt.

          Hab eine andere Regel:
          RewriteRule ^(.*/|)([^/.]*)(.|)(.*)$ index.php?dir=$1&name=$2&typ=$4 [L]

          Wolltest du nicht, dass in den vier Fällen die Regel eben nicht passt? So habe ich zumindest  "404 bei..." im 1. Posting gedeutet.

          404 bei
          -"dir/file"
          -"file.ext"
          -"file" (ohne Dateiendung)
          -".ext" (Nur Dateiendung)

          Deine regEx passt auch auf diese Fälle.