Chrisi: Mod Rewrite - Rewrite MAP geht nur beim 1, mal ...

Hallo zusammen,

ich habe heute einen ganzen Tag damit verbracht zu verstehen warum meine RewriteMap nicht funktioniert, hab es aber noch immer nicht hinbekommen. Ich versuche mal mich verständlich auszudrücken und hoffe auf eure Hilfe:

Meine http.conf:

RewriteEngine on
RewriteMap MAPQUERY prg:/srv/www/maps/map.php

Dann meine Rule im .htacess File:

RewriteEngine on
RewriteRule ^([a-z]+)/([-.%+_0-9a-z]+).htm$ $1.php?${MAPQUERY:$2} [L]

Mein Map Script liest STDIN und wandelt die Query von "var-wert,var-wert" in "var=wert&var=wert" und gibt diese dann wieder auf STDOUT aus ... Ganz simpel klappt sogar :-)

Der Hacken, dass klappt immer nur einmal, wenn ich den Broswer aktualisieren will gibt mein MAP Script keine Daten mehr zurück, bzw. es wird ganricht erst aufgerufen ... Abhilfe schafft hier nur ein Neustart des Apachen, dannach klappt es dann wieder genau einmal.

Habe das auf 2 Servern geprüft, auf beiden das gleiche Ergebniss.

Hier mal der relevante Auszug aus den Logs:

1. Aufruf:
map lookup OK: map=MAPQUERY key=var-wert -> val=var=wert

2. Aufruf
map lookup OK: map=MAPQUERY key=var-wert -> val=

Ich weiß jetzt nicht wirklich wo ich den Fehler suchen soll, weil beim ersten mal klappt es ja, also muss mein Mapscript ja OK sein ...

Ich kann nur hoffen das jemand dieses Problem kennt und mir einen Tipp geben kann ?

Danke für jeden Hinweis,

Chrisi

  1. Hallo,

    sieh Dir mal <http://de.wikibooks.org/wiki/Websiteentwicklung:_PHP:_Konfiguration#Pseudo-URLs_durch_PATH_INFO@=Pseudo-URLs durch PATH_INFO> an. mod_rewrite ist unnötig.

    Gruß aus Berlin!
    eddi

    1. Hallo eddi,

      sieh Dir mal <http://de.wikibooks.org/wiki/Websiteentwicklung:_PHP:_Konfiguration#Pseudo-URLs_durch_PATH_INFO@=Pseudo-URLs durch PATH_INFO> an. mod_rewrite ist unnötig.

      Ähm, hast Du Dir die RewriteRule im Ausgangsposting überhaupt durchgelesen? Das kann man so ohne weiteres mit PHP alleine *nicht* bewerkstelligen (klar, man kriegt das schon irgendwie hingetrickst, aber so einfach wie mit mod_rewrite ist das nicht - v.a. hat diese RewriteRule den Vorteil, dass sie nur für bestimmte Patterns greift - der Apache übernimmt also den ganzen HTTP-Behandlungskrempel für Resourcen, auf die das Pattern nicht zutrifft - das müsste man sonst mit PHP selbst machen).

      Viele Grüße,
      Christian

      --
      "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup
      1. Hallo,

        den Verweis sollte ich mal geradebiegen: Pseudo-URLs durch PATH_INFO

        Ähm, hast Du Dir die RewriteRule im Ausgangsposting überhaupt durchgelesen?

        ja.

        Das kann man so ohne weiteres mit PHP alleine *nicht* bewerkstelligen

        Veto!

        (klar, man kriegt das schon irgendwie hingetrickst,

        Nicht nur igendwie, sondern ganz sauber und passabel.

        aber so einfach wie mit mod_rewrite ist das nicht - v.a. hat diese RewriteRule den Vorteil, dass sie nur für bestimmte Patterns greift - der Apache übernimmt also den ganzen HTTP-Behandlungskrempel für Resourcen, auf die das Pattern nicht zutrifft - das müsste man sonst mit PHP selbst machen).

        Das scheint mir etwas sinnfrei zu sein. Resourcen, auf die eine PHP-gesteuerte Requestumformatierung nicht angewendet werden soll, verweisen schlichtweg auf ein anderes Verzeichnis.

        Gruß aus Berlin!
        eddi

        1. Hallo eddi,

          (klar, man kriegt das schon irgendwie hingetrickst,

          Nicht nur igendwie, sondern ganz sauber und passabel.

          Nur, wenn Du folgendes voraussetzt:

          Resourcen, auf die eine PHP-gesteuerte Requestumformatierung nicht angewendet werden soll, verweisen schlichtweg auf ein anderes Verzeichnis.

          Allerdings ist der Witz an URL-Umschreibungen ja gerade der, dass man sich die URLs komplett selbst aussuchen kann (so dass sie möglichst sinnvoll sind) und sich *danach* überlegt, wie man das serverseitig umsetzt - wenn Du das obige voraussetzt richtest Du die URLs ja nach technischen Gegebenheiten - was ja dem Paradigma, warum man überhaupt URL-Umschreibungen macht, widerspricht.

          Viele Grüße,
          Christian

          --
          "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup
          1. Hallo,

            (klar, man kriegt das schon irgendwie hingetrickst,

            Nicht nur igendwie, sondern ganz sauber und passabel.

            Nur, wenn Du folgendes voraussetzt:

            Resourcen, auf die eine PHP-gesteuerte Requestumformatierung nicht angewendet werden soll, verweisen schlichtweg auf ein anderes Verzeichnis.

            (wirklich nicht böse gemeint:) ich kennte die Direktive AliasMatch und kann auch mir ihr umgehen.

            Allerdings ist der Witz an URL-Umschreibungen ja gerade der, dass man sich die URLs komplett selbst aussuchen kann (so dass sie möglichst sinnvoll sind) und sich *danach* überlegt, wie man das serverseitig umsetzt - wenn Du das obige voraussetzt richtest Du die URLs ja nach technischen Gegebenheiten - was ja dem Paradigma, warum man überhaupt URL-Umschreibungen macht, widerspricht.

            Eine URL wird durch einen beliebig wählbares Sufix (in der Form "%{begriff}/") nicht sinnlos, es ersparte einem nur zusätzliche Module.

            Das ist also kein Argument.

            Gruß aus Berlin!
            eddi

            1. Hallo eddi,

              (klar, man kriegt das schon irgendwie hingetrickst,

              Nicht nur igendwie, sondern ganz sauber und passabel.

              Nur, wenn Du folgendes voraussetzt:

              Resourcen, auf die eine PHP-gesteuerte Requestumformatierung nicht angewendet werden soll, verweisen schlichtweg auf ein anderes Verzeichnis.

              (wirklich nicht böse gemeint:) ich kennte die Direktive AliasMatch und kann auch mir ihr umgehen.

              Ich sagte ja, "man kriegt das schon irgendwie hingetrickst". AliasMatch ist btw. nur in der zentralen Serverkonfiguration erlaubt. Und wenn Du mit AliasMatch um Dich wirfst, mag das vielleicht ein paar CPU-Zyklen schneller sein, allerdings ist die Lösung in meinen Augen deutlich weniger "straight-forward" als mod_rewrite - und deswegen IMHO auch schlechtbar wartbar.

              Allerdings ist der Witz an URL-Umschreibungen ja gerade der, dass man sich die URLs komplett selbst aussuchen kann (so dass sie möglichst sinnvoll sind) und sich *danach* überlegt, wie man das serverseitig umsetzt - wenn Du das obige voraussetzt richtest Du die URLs ja nach technischen Gegebenheiten - was ja dem Paradigma, warum man überhaupt URL-Umschreibungen macht, widerspricht.

              Eine URL wird durch einen beliebig wählbares Sufix (in der Form "%{begriff}/") nicht sinnlos, es ersparte einem nur zusätzliche Module.

              Das ist also kein Argument.

              Ich sagte nicht, dass sie _sinnlos_ wird. Ich sagte nur, dass Du auf Grund von ein paar eingesparten CPU-Zyklen (vergiss bitte nicht: wenn Du nichts wirklich blödes anstellst, ist mod_rewrite trotzdem *sehr* schnell) das Paradigma zumindest teilweise über den Haufen wirfst, das überhaupt der Grund für die ganze Veranstaltung ist. Ich will auch nichts *grundsätzlich* gegen die Lösung mit PATH_INFO sagen, sie ist genau dann sinnvoll, wenn man bestimmte "Verzeichnisse" hat, unter denen man *alle* Pfade durch PHP verarbeiten lassen will (nach dem Schema RewriteRule verzeichnis/.* irgendwas.php) *oder* aber man kein mod_rewrite zur Verfügung hat (Hoster hat das nicht), PATH_INFO jedoch funktioniert. Wenn man allerdings kompliziertere Patterns hat, dann sehe ich nicht, warum man mod_rewrite nicht verwenden sollte und zwangsläufig sich entweder verausgaben muss, um das mittels PATH_INFO sauber hinzubekommen oder sein URL-Schema doch ändert, um der technischen Gegebenheit zu folgen.

              Viele Grüße,
              Christian

              --
              "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup
              1. Hallo,

                ums kurz abzuschließen: Ich grieg bloß immer Picke, wenn ich sehe, daß mit mod_rewrite hantiert wird, wenn dann eh PHP aufgerufen wird... ^^

                Gruß aus Berlin!
                eddi

    2. Hi Eddi,

      danke für den Tipp.

      <http://de.wikibooks.org/wiki/Websiteentwicklung:_PHP:_Konfiguration#Pseudo-URLs_durch_PATH_INFO@=Pseudo-URLs durch PATH_INFO> an. mod_rewrite ist unnötig.

      Habe mir auch schonmal überlegt sowas direkt über PHP zu machen, finde das ganze aber zu kompliziert, zumal man da direkt an den Variablen spielt ... Denke da lohnt der Aufwandt nicht ... Ich habe wirklich einige URLS die umgeschrieben werden. In der Htaccess werden später auch noch alte URLS abgefangen und wieder umgeleitet (302) u.s.w... So habe ich das dann alles in der .htaccess und behalte wenigstens etwas Überblick :-)

      Viele Grüße

      Chrisi

      1. Hallo,

        Habe mir auch schonmal überlegt sowas direkt über PHP zu machen, finde das ganze aber zu kompliziert, zumal man da direkt an den Variablen spielt

        ja - stimmt. "Wat der Baua nich kennt - dat fritta nich..."

        Denke da lohnt der Aufwandt nicht

        Dir ist anscheinend nicht klar, welchen Aufwand Du gerade betreibst. Es kommt eine Request herrein, der erst durch die Rewriteengine geschleust wird, um dann ein für diesen Zweck völlig überdimensionierten PHP-Parser anzuschmeisen, der 5 Zeilen code umformt, die Du ebenso besser auch in Deinem (Web-)Script umformen kannst - allerding mit dem geringen Unterschied, daß nur ein einzelnen Parseprozess erstellt werden muß.

        ... Ich habe wirklich einige URLS die umgeschrieben werden. In der Htaccess werden später auch noch alte URLS abgefangen und wieder umgeleitet (302) u.s.w... So habe ich das dann alles in der .htaccess und behalte wenigstens etwas Überblick :-)

        Du hast es ja eben nicht in einer Konfigurationsdatei, sondern zudem auch noch in einer Rewritemap anstatt alles in ein einziges Script unterzubringen. Tschuldigung aber die Begründung eignet sich nun wirklich nicht diesen Mehraufwand mit "Einfachheit" zu rechtfertigen.

        Gruß aus Berlin!
        eddi

  2. Hallo,

    Ich weiß jetzt nicht wirklich wo ich den Fehler suchen soll, weil beim ersten mal klappt es ja, also muss mein Mapscript ja OK sein ...

    Nicht zwangsläufig. Wie sieht Dein Script aus? Ich vermute nämlich ganz stark, dort liegt der Fehler.

    Viele Grüße,
    Christian

    --
    "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup
    1. Hi Christian,

      Wie sieht Dein Script aus? »»

      #!/usr/local/php5/bin/php -q
      <?php

      while($input = trim(fgets(STDIN, 256))) {
           fputs(STDOUT, str_replace(array('-',','),array('=','&'),$input));
        exit(0);
          }

      exit(0);

      ?>

      Bei Aufruf über die Shell klappt es, beim 1. Versuch über ModRewrite auch.

      Viele Grüße ...

      Chrisi

      1. Hallo Chrisi,

        #!/usr/local/php5/bin/php -q
        <?php

        while($input = trim(fgets(STDIN, 256))) {
             fputs(STDOUT, str_replace(array('-',','),array('=','&'),$input));
          exit(0);

        Dieses exit(0); ist Dein Problem. Das Programm muss weiterlaufen, siehe auch die Apache-Doku. Mach stattdessen ein flush(); - dann sollte es gehen.

        Viele Grüße,
        Christian

        --
        "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup
        1. Hi Christian,

          Dieses exit(0); ist Dein Problem.

          while($input = trim(fgets(STDIN, 256))) {
               fputs(STDOUT, str_replace(array('-',','),array('=','&'),$input));
            flush();
              }

          Jetzt läüft das Prgramm endlos weiter, wenn ich im Browser was aufrufe :-) Also die Seiten lassen sich garnicht aufrufen ... Ich bekomme aber auch keinen Fehler oder sowas zurück ...

          Rewrite Log:

          applying pattern '^([a-z]+)/([-.%+_0-9a-z]+).htm$' to uri 'test/var-wert.htm'

          Das ist das letzte was er macht, dannach kommt normalerweise die Info das er die Map ausgeführt hat ...

          Viele Grüße

          Chrisi

          1. Hallo Chrisi,

            Jetzt läüft das Prgramm endlos weiter, wenn ich im Browser was aufrufe :-) Also die Seiten lassen sich garnicht aufrufen ... Ich bekomme aber auch keinen Fehler oder sowas zurück ...

            Ah, Du musst noch ein "\n" ausgeben, d.h.

            fputs(STDOUT, str_replace(array('-',','),array('=','&'),$input)."\n");

            Viele Grüße,
            Christian

            --
            "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup
            1. Hallo Christian,

              fputs(STDOUT, str_replace(array('-',','),array('=','&'),$input)."\n");

              Ahh, jetzt geht es :-) Danke ... So klein die Fehler sind ...

              Viele Grüße

              Chrisi ...

          2. Hallo,

            RewriteEngine on  
            RewriteRule ^([a-z]+)/([\-\.%\+_0-9a-z]+).htm$ $1.php?$2 [L]
            

            Löse, wenn Du einen komplett in PHP umgesetzten Weg nicht beschreiten willst, Dein Problem, indem Du in jedem Deiner Scripte $_SERVER['QUERY_STRING'] umformst:

            $q=explode(',',$_SERVER['QUERY_STRIN']);  
            foreach($q as $v){  
               $v=explode('-'$v,2);  
               $_GET[$v[0]]=$v[1];  
            }
            

            binde dieses Script in jedes Script durch include() ein. ENDE!

            Gruß aus Berlin!
            eddi

            1. Hi Eddi,

              $q=explode(',',$_SERVER['QUERY_STRIN']);

              foreach($q as $v){
                 $v=explode('-'$v,2);
                 $_GET[$v[0]]=$v[1];
              }

                
              Das funktioniert auch prima und bringt Performance. Heute mittag wollte ich noch die ganze URL umschreiberei aufgeben und jetzt habe ich 2 funktionierende Möglichkeiten :-)  
                
              Danke für Eure Hilfe nochmal.  
                
              Viele Grüße  
                
              Chrisi