Ricci: mod_rewrite Ordner auf index.php umleiten

Hallo Forum,

ich bin ein mod_rewrite Neuling und komme damit einfach nicht so richtig klar.

Ich möchte gerne folgendes erreichen:
Anfragen an einen Unterordner der Domain sollen auf den Domain-root umgeleitet werden und der angefragte Ordner als id übergeben werden.

Beispiel:
http://abcd.de/01   => http://abcd.de/?id=01
http://abcd.de/ab   => http://abcd.de/?id=ab
http://abcd.de/3g   => http://abcd.de/?id=3g

Hintergrund ist lediglich der, dass der URL so kurz wie möglich sein soll, das dieser in einem QR-Code abgebildet ist. Wenn ich das was ich eigentlich will in dem QR-Code abbilde, passt das zwar, jedoch wird der QR-Code durch den längeren URL dadurch etwas komplexer, was zu Leseproblemen führen kann (nicht muss).
Es geht also darum so wenig Zeichen wie möglich im "Ursprungs-URL" abzubilden. Die index.php im root übernimmt dann die id und leitet (mit Hilfe einer Datenbank) auf Bilder, PDF's, Webseiten, YouTube etc. um. Das ist nicht das Problem.

Die zwei Zeichen nach der Domain sollen dabei dynamisch bleiben, ich habe nur 3 Beispiele aufgeführt, tatsächlich sind das derzeit rund 50 Zeistellige-Zeichenkombinationen nach dem / 0-9, a-z, A-Z.

Hat mir jemand bitte einen Code-Schnipsel?

Danke!

  1. Tach!

    Hintergrund ist lediglich der, dass der URL so kurz wie möglich sein soll, das dieser in einem QR-Code abgebildet ist. Wenn ich das was ich eigentlich will in dem QR-Code abbilde, passt das zwar, jedoch wird der QR-Code durch den längeren URL dadurch etwas komplexer, was zu Leseproblemen führen kann (nicht muss).

    Deine Befürchtungen sind vermutlich unbegründet. QR-Code ist so designt, dass je nach Stufe zwischen 7 und 30% vom Muster beschädigt/unleserlich sein kann.

    Die zwei Zeichen nach der Domain sollen dabei dynamisch bleiben, ich habe nur 3 Beispiele aufgeführt, tatsächlich sind das derzeit rund 50 Zeistellige-Zeichenkombinationen nach dem / 0-9, a-z, A-Z.

    Auf die Großbuchstaben würde ich verzichten wollen. Dann blieben immer noch 1296 Möglichkeiten übrig. Und das ist auch ein Problem(chen). Denn unbenutzte Kombinationen müssen auf jeden Fall von den benutzten unterschieden werden. Du brauchst also eine Datenhaltung der benutzten Codes, und es ist ist egal, ob du nun dagegen nur zweistellige oder 23-stellige URLs vergleichst. Das heißt, du kannst genausogut das bewährte Muster "alles was keine existierende Datei oder Verzeichnis ist, wird umgeschrieben" verwenden. Ein Übersetzen in Querystring-Parameter kann ebenfalls entfallen, weil man mit dem Auswerten von $_SERVER['REQUEST_URI'] (PHP angenommen) ebenfalls das Ziel erreicht.

    Somit sollte das bewährte

    RewriteCond %{REQUEST_FILENAME} !-f  
    RewriteCond %{REQUEST_FILENAME} !-d  
    RewriteRule .* index.php [L,QSA]
    

    seinen Dienst tun.

    dedlfix.

    1. Hallo dedlfix,

      vielen Dank! Das funktioniert soweit prima. Klar kann ich auf die Großbuchstaben verzichten, die Kombinationsmöglichkeiten reichen völlig aus.

      $array = explode("/",$_SERVER['REQUEST_URI']);  mach ich dann den Rest.

      Nochmals vielen Dank!!!

      Anbei noch ein Nachtrag zum QR-Code, da habe ich mich wohl nicht richtig ausgedrückt. Ich weiß, dass der je nah Stufe bis zu 30% unleserlich sein darf (auch Bildchen in der Mitte sind ja oft vorhanden).
      Versuche mit diversen Smartphones und etlichen QR-Apps haben jedoch gezeigt, dass der "kleine" QR-Code (21x21 Felder) wesentlich schneller/besser und größeren Entfernungen gelesen wird, wie der nächstgrößere QR-Code (25x25 Felder) oder sogar 29x29 Felder. Deshalb möchte ich den "Kleinen" lieber verwenden. Dazu muss der URL jedoch sehr kurz sein.

      Schönen Tag noch.

    2. Hallo dedlfix,

      eine kleine Frage noch? Kann ich dort auch eine Ausnahme definieren? Wahrscheinlich geht das sicherlich, leider kenn ich mich da wie gesagt nicht aus.

      Die Pfade

      http://abcd.de/gernerator/
      http://abcd.de/adm/

      sollten von der rewrite-Regel ausgeschlossen werden. Kannst mir da nochmal helfen?

      Danke

      1. Tach!

        Kann ich dort auch eine Ausnahme definieren? Die Pfade [...] sollten von der rewrite-Regel ausgeschlossen werden.

        Wenn das existierende Verzeichnisse sind, dann sind sie bereits ausgeschlossen durch das

        RewriteCond %{REQUEST_FILENAME} !-d

        Wenn sie nur virtuell sind und der Request vom Apachen aus anders behandelt werden soll, dann braucht es eine Regel vor dem gezeigten Dreizeiler. Wenn sie nur innerhalb PHPs anders behandelt werden sollen, dann braucht es nur in PHP entsprechenden Code.

        dedlfix.

        1. Hallo dedlfix,

          vielen dank nochmals. Hast natürlich Recht, klappt soweit prima - wie erwartet.

          Wie gesagt, ich bin da Neuling und der Syntax leuchtet mir nicht ganz so ein, sonst hätte ich wohl selbst erkannt, dass die Regel wohl nur dann funktioniert wenn der Ordner nicht da ist ( !-d ), ansonsten wird der gewünschte Pfad aufgerufen.

          Hab schon rum gesucht, aber kannst mir vielleicht ne Seite empfehlen, wo ich mich etwas einarbeiten kann? Was ich bisher gefunden habe, kapier ich schon von Anfang an nicht, weil die für mich bis jetzt noch seltsamen Zeichenfolgen wie ^a oder .+ nicht so richtig erklärt wurden.

          Vielen Dank nochmals und schönes Wochenende!

          1. Tach!

            Wie gesagt, ich bin da Neuling und der Syntax leuchtet mir nicht ganz so ein, sonst hätte ich wohl selbst erkannt, dass die Regel wohl nur dann funktioniert wenn der Ordner nicht da ist ( !-d ), ansonsten wird der gewünschte Pfad aufgerufen.
            Hab schon rum gesucht, aber kannst mir vielleicht ne Seite empfehlen, wo ich mich etwas einarbeiten kann? Was ich bisher gefunden habe, kapier ich schon von Anfang an nicht, weil die für mich bis jetzt noch seltsamen Zeichenfolgen wie ^a oder .+ nicht so richtig erklärt wurden.

            Es kommen hier mindestens zwei Dinge zusammen. Das -d oder dessen Negierung !-d gehört zur Syntax (die nicht der!) der Apache-Direktive RewriteCond. Das andere ist das was in der RewriteRule verwendet wird. Das hört auf den Namen regulärer Ausdruck (regular expression) und dient dazu ein Muster zu beschreiben. Ähnlich wie bei zum Beispiel *.php in Dateinamen, aber viel mächtiger. Wenn du dir also dazu ein Einsteigertutorial suchst, solltest du weiterkommen.

            dedlfix.