Cheatah: RewriteRule mit Zero-Padding

Hi,

ich stehe vor dem Problem, ein nicht ganz leichtes URL-Rewriting durchführen zu dürfen. Der Request geht z.B. auf "/bla/123/", und als Ergebnis muss dann "/bla/0000/0000/0123.blub" ausgelesen werden.

Das Aufsplitten einer Zahl in Viererketten ist kaum 'ne Fingerübung, aber die (eventuell) fehlenden Nullen aufzufüllen macht mir dann doch etwas Kopfzerbrechen. Meine Lösung sähe mehr oder weniger so aus, erst mal "auf gut Glück" etwas wie "/bla///123.blub" zu erzeugen, und dann in späteren Rewrites alle "/(\d{0,3})/" durch "/0$1/" zu ersetzen (o.ä.), bis nichts mehr gefunden wird.

Ich bin davon überzeugt, dass das ganze auch in einem, maximal zwei Rewrites geht, nur fehlt mir der geniale Gedanke; zudem ist meine Erfahrung mit mod_rewrite noch recht minimal. Kann mir jemand auf die Sprünge helfen?

Cheatah

  1. Hoi,

    ich stehe vor dem Problem, ein nicht ganz leichtes URL-Rewriting durchführen zu dürfen. Der
    Request geht z.B. auf "/bla/123/", und als Ergebnis muss dann "/bla/0000/0000/0123.blub"
    ausgelesen werden.

    Das Aufsplitten einer Zahl in Viererketten ist kaum 'ne Fingerübung, aber die (eventuell)
    fehlenden Nullen aufzufüllen macht mir dann doch etwas Kopfzerbrechen. Meine Lösung sähe
    mehr oder weniger so aus, erst mal "auf gut Glück" etwas wie "/bla///123.blub" zu erzeugen, und
    dann in späteren Rewrites alle "/(\d{0,3})/" durch "/0$1/" zu ersetzen (o.ä.), bis nichts mehr
    gefunden wird.

    Ouch, das wird aber viel Traffic.

    Ich bin davon überzeugt, dass das ganze auch in einem, maximal zwei Rewrites geht, nur fehlt
    mir der geniale Gedanke; zudem ist meine Erfahrung mit mod_rewrite noch recht minimal. Kann
    mir jemand auf die Sprünge helfen?

    Wie waere es mit RewriteMap?

    RewriteEngine On
    RewriteMap scary-url prg:/path/to/perlscript

    RewriteCond ^/bla/123/
    RewriteRule ^/bla/123/ ${scary-url:/bla/123/|default-val}

    perlscript:
    #!/usr/bin/perl -w
    $| = 1;
    while(my $row = <STDIN>)
     {
      ### die transformationen erspar ich mir jetzt, das kannst du besser
     }

    Gruesse,
     CK

    1. Hi,

      Ouch, das wird aber viel Traffic.

      naja, es findet alles noch serverintern statt, ohne Roundtrip zum Client. Ist aber trotzdem nicht hübsch...

      Wie waere es mit RewriteMap?

      Keine schlechte Idee; nur fürchte ich, dass ein Perlscript nicht wirklich die Zustimmung unserer IT findet... allein schon den Perl-Interpreter ein paar dutzend Mal pro Sekunde neu zu starten könnte ein wenig unperformant sein :-)

      ### die transformationen erspar ich mir jetzt, das kannst du besser

      Danke :-)

      Ich behalte die Idee mal im Hinterkopf; auf jeden Fall ist es eine Lösung, die ich testen werde - danke dafür! Ich bin aber weiterhin offen für Alternativen ;-)

      Cheatah

      1. Hoi,

        Wie waere es mit RewriteMap?

        Keine schlechte Idee; nur fürchte ich, dass ein Perlscript nicht wirklich die Zustimmung unserer IT
        findet... allein schon den Perl-Interpreter ein paar dutzend Mal pro Sekunde neu zu starten könnte
        ein wenig unperformant sein :-)

        Tja, es muss ja nicht unbedingt ein Perl-Script sein. Schreib dir halt ein kleines C-Programm,
        das tuts auch; viel laenger als 10 Zeilen braeuchte es ja nicht zu sein.

        Gruesse,
         CK

        1. Hi,

          Tja, es muss ja nicht unbedingt ein Perl-Script sein. Schreib dir halt ein kleines C-Programm,
          das tuts auch; viel laenger als 10 Zeilen braeuchte es ja nicht zu sein.

          klingt schon ein wenig freundlicher... obwohl ich unsere gestrenge IT schon meckern höre :-)

          "Mein C-Mensch" ist leider erst nächste Woche wieder da; und da hier mittlerweile jemand auf eine etwas internere (potentielle) Möglichkeit hingewiesen hat, warte ich auf jeden Fall erst mal ab, was der dazu meint. Ich halte Dich aber auf dem laufenden :-)

          Chea "Thanks again" tah

      2. hi!

        Keine schlechte Idee; nur fürchte ich, dass ein Perlscript nicht
        wirklich die Zustimmung unserer IT findet... allein schon den
        Perl-Interpreter ein paar dutzend Mal pro Sekunde neu zu starten
        könnte ein wenig unperformant sein :-)

        .oO( mod_perl )

        bye, Frank!

        1. Hi,

          .oO( mod_perl )

          steht leider aus Gründen, die sowohl den Rahmen als auch meine Schweigepflicht sprengen, zu meinem tiefsten Bedauern nicht zur Debatte. Aber thanks für den Gedanken :-)

          Cheatah

          1. Hoi,

            .oO( mod_perl )

            steht leider aus Gründen, die sowohl den Rahmen als auch meine Schweigepflicht sprengen, zu meinem tiefsten Bedauern nicht zur Debatte. Aber thanks für den Gedanken :-)

            Und ist auch gar nicht moeglich in dem Fall.

            Gruesse,
             CK

  2. Hallo,

    Und was ist, wenn Du zuerst mal Nullen anhängst, und die überschüssigen dann in einem zweiten Schritt entfernst?

    Dann kanstt Du "/bla/0000/0000/0000123.blub" mittels  /0+(\d{4})/ auf  /$1/ mappen.

    Ist nur so eine Idee.

    Grüße
      Klaus

    1. Hi,

      Und was ist, wenn Du zuerst mal Nullen anhängst, und die überschüssigen dann in einem zweiten Schritt entfernst?

      kein übler Gedanke. Kostet garantiert zwei Rewrites, ist aber damit O(1) und ergo überschaubar :-)

      Prima Idee, danke!

      Cheatah

  3. Hi,

    ich stehe vor dem Problem, ein nicht ganz leichtes URL-Rewriting durchführen zu dürfen. Der Request geht z.B. auf "/bla/123/", und als Ergebnis muss dann "/bla/0000/0000/0123.blub" ausgelesen werden.

    Welcher Zahlenbereich muß denn da abgedeckt werden? Welcher Request kommt denn raus, wenn /bla/12345/ angefordert wird?

    In Erweiterung der Idee, erstmal viele Nullen davorzusetzen:
    Zunächst von /bla/123/ auf /bla/000000000123/, dann Viererketten bilden. Bei unterschiedlich langen Ziffernfolgen von hinten vielleicht eine kleine Herausforderung. :)

    - Sven Rautenberg

    1. Hi,

      Welcher Zahlenbereich muß denn da abgedeckt werden?

      zumindest ein- bis zehnstellige Zahlen.

      Welcher Request kommt denn raus, wenn /bla/12345/ angefordert wird?

      /bla/0000/0001/2345.blub

      Im Grunde wird die Zahl zwölfstellig gemacht und nach jeder vierten Stelle durch einen Slash getrennt.

      Zunächst von /bla/123/ auf /bla/000000000123/, dann Viererketten bilden.

      Wird schwierig, weil ich nicht automagisch die nötige Zahl der Nullen ermitteln kann. Ich lasse mich gerne vom Gegenteil überzeugen; aber bei dieser Variante brauche ich glaube ich (fix) drei Rewrites.

      Bei unterschiedlich langen Ziffernfolgen von hinten vielleicht eine kleine Herausforderung. :)

      Ja - die unterschiedliche Länge ist es, die mir zu schaffen macht... ohne das wär's ja einfach :-)

      Auch Dir danke,

      Cheatah