AlexBausW: Apache SSI exec: Encoding von cmd="..."

Hallo Alle,

Nachdem ich diese Woche schon fast zwei Fragen gestellt hätte, aber bisher immer im letzten Moment das Problem lösen könnte, weil ich bis dahin zu blöd war *g*, komme ich jetzt wohl nicht umhin, eine zu stellen. ;)

In einer Seite möchte ich per SSI cmd exec aus dem $QUERY_STRING Parameter extrahieren, um sie an verschieden URLs wieder anhängen zu können.
Dazu verwende ich folgende Anweisung:

<!--#exec cmd="perl -we "($q)=$ARGV[0]=~/query_a=([^&]+)/;$q=~s/%([a-fA-F0-9]{2})/pack("C",hex($1))/eg;print $q" $QUERY_STRING" -->

Ein Beispiel-Querystring sieht wie folgt aus und wird auch von <!--#echo var="QUERY_STRING" --> so ausgegeben:

query_a=sig%3Dabcdef123%26var%3Dval&query_b=sig%3Dabcdef123%26var%3Dval

Das Extrahieren funktioniert auch ganz gut, nur das anschließende URL-decoden macht mich noch ganz wuschig. ;)
So wie es oben steht, gibt es keine Ausgabe und keine Fehlermeldung. Maskiere ich % mit \ hat das den selben Effekt wie vorher. Nur wenn ich z.B. s/%3D/X/ schreibe, wird "sig%3Dabcd" zu "sigXabcd". Möchte ich mit s/%/X/ nur die % austauschen, gibt es wieder keine Ausgabe und keine Fehlermeldung. Bei s/%253D/X/ (als URL-Codierung von %) wird der extrahierte Parameter - also $q - unverändert ausgegeben.
Deshalb vermute ich, daß dieses seltsame Verhalten etwas mit der Codierung von % zu tun hat.

Was muss ich nun tun, um mein Vorhaben wie oben umzusetzen?

Ich könnte natürlich auch ein kleines Skript schreiben, daß mir die Arbeit abnimmt, oder ich lade URI::Escape. Aber mir geht es auch um die prinzipielle Klärung, weil so was wie <!--#exec cmd="perl -we "%h = (1,2,3,4); print keys %h;"" --> so eben auch nicht "funktioniert". :)

Gruß Alex

  1. Hi,

    In einer Seite möchte ich per SSI cmd exec aus dem
    $QUERY_STRING Parameter extrahieren, um sie an
    verschieden URLs wieder anhängen zu können.

    macht es in Deinem Fall wirklich noch Sinn, die Steuerung in SSI zu erledigen, statt sie komplett dem CGI-Skript zu überlassen? Statt mehrere Technologien zu mischen, würde ich hier wahrscheinlich nur eine (und zwar die mächtigste) einsetzen wollen.

    Viele Grüße
          Michael

  2. Moin, Du!

    Das Extrahieren funktioniert auch ganz gut, nur das anschließende URL-decoden macht mich noch ganz wuschig. ;)

    Warum willst du die Daten denn dekodieren? Wenn du den Parameter an einen Link dranhängen willst, sollte dieser hübsch codiert bleiben. Du mußt sogar noch dafür sorgen, daß die &-Zeichen für HTML maskiert werden und aus & ein & wird, sonst meckert der Validator.

    Im Prinzip mußt du also nur den Query-String an den &-Zeichen auseinandernehmen und die gewünschten Teile mit '& wieder zusammensetzen und ausgeben.

    Oder liegt dein Problem eher beim Aufruf von Perl allgemein?

    - Sven Rautenberg

  3. Hoi,

    Nachdem ich diese Woche schon fast zwei Fragen gestellt hätte, aber bisher
    immer im letzten Moment das Problem lösen könnte, weil ich bis dahin zu
    blöd war *g*, komme ich jetzt wohl nicht umhin, eine zu stellen. ;)

    Hehe ;-) Das *du* mal 'ne Frage stellst... ;-)

    <!--#exec cmd="perl -we "($q)=$ARGV[0]=~/query_a=([^&]+)/;$q=~s/%([a-fA-F0-9]{2})/pack("C",hex($1))/eg;print $q" $QUERY_STRING" -->

    So wie es oben steht, gibt es keine Ausgabe und keine Fehlermeldung.
    Maskiere ich % mit \ hat das den selben Effekt wie vorher. Nur wenn
    ich z.B. s/%3D/X/ schreibe, wird "sig%3Dabcd" zu "sigXabcd". Möchte ich mit »» s/%/X/ nur die % austauschen, gibt es wieder keine Ausgabe und keine
    Fehlermeldung. Bei s/%253D/X/ (als URL-Codierung von %) wird der
    extrahierte Parameter - also $q - unverändert ausgegeben.
    Deshalb vermute ich, daß dieses seltsame Verhalten etwas mit der Codierung
    von % zu tun hat.

    Ich befuerchte, das ist ein Bug beim Apachen. Der meint dazu naemlich:

    [Thu Mar  7 17:56:09 2002] [error] [client 127.0.0.1] premature EOF in parsed file /usr/local/www/data/test.shtml

    Allerdings nur bei einem von dir beschriebenen Query-String. Ich fuerchte, du
    wirst die Seite mit CGI generieren muessen.

    Gruesse,
     CK