sne1Medlem sedan jan. 200363 inlägg Den som löser detta är rejält duktig på sina saker...!
Jag har ett litet cgi-script som räknar antal click och som förväntar sig en URL, för att kunna redirecta omedelbart efter clickräkningen, enligt följande påhittade exempel.
CGI-scriptet fungerar utmärkt.
Ibland måste jag dock ersätta exempelvis "&" med %26, ";" med %3b och "+" med %2b, för att få redirect att fungera korrekt.
Men det är OK.
Tills jag har en alltför "avancerad" URL som inparameter till CGI-scriptet.
Problemet verkar vara att ett av "värdena" i http-harangen innehåller ett "&"-tecken, som SKALL vara just TECKNET "&" och INTE specificera att det är någon slags "kod" på gång, som i andra fall (i ex.vis "?what=map%26mop=xx" har %26 ersatt ett "kod-&").
Troligen är det alltså "&" i "Pelle's%2bStrul%2b%26%2bProblem" som måste fixas till, på något vis.
Jag fattar dock inte hur jag skall kunna kringgå detta...
TACKSAM för hjälp!
Som sagt; den som löser detta är rejält duktig på sina saker...!
http://min.hemsida.se/cgibin/click.pl?URL=http://www.referenssida.se/query
?what=map%26mop=xx%26mapcomp=RSID_10888161%3b584745%3bPelle's%2bStrul%2b%26
%2bProblem%3bSandgatan%2b%3b69%3b%3b12345%3bG%D6TEBORG%3b031%3b41%2b00%2b
77%3b1269142%3b6400864%3b0%3b0%26mapstate=7%3b1269142%3b6400864%3b0%3b0%3b0%
3b0%3b0%3b
(OBSERVERA att eventuella space eller radmatningar mellan tecknen i länken ovan INTE skall vara där; allt är i en enda lång rad!)
HansenMedlem sedan aug. 2000374 inlägg Posta lite kod, så blir det lättare att hjälpa dig!
sne1Medlem sedan jan. 200363 inlägg Tack Hansen!
Hoppas att du fixar det!
CGI-scriptet click.pl ser ut som följer.
#!/usr/bin/perl
use strict;
use CGI;
my $cgi = new CGI;
my $time = localtime(time);
my $url = $cgi->param("URL");
my $file = "./log/log.txt";
write_log();
print $cgi->header();
print $cgi->start_html(-title => 'Redirecting... Please wait...');
print "<body onload=location.href='" . "$url" . "'>";
print $cgi->end_html();
exit(0);
sub write_log()
{
open(LOG, ">>$file");
print LOG "$url*$time*\n";
close(LOG);
}
Smutt litet script, va!?
:-)
/Pelle
HansenMedlem sedan aug. 2000374 inlägg
Smutt litet script, va!?
Bra att du använder CGI.pm!
open(LOG, ">>$file") or die "can't append data to $file. reason: $!\n";
är bättre.
Kan ge ett exempel på en input url och output från scriptet?
sne1Medlem sedan jan. 200363 inlägg Bra förslag till open... men det fungerar så bra (bara detta som har krånglat, so far) och ingen annan felhantering finns, så...
:-)
Vad menar du med CGI.pm?
Menar du CGI.pl?
Visst!
Input:
http://min.hemsida.se/cgibin/click.pl?URL=http://www.webforum.nu/
kommer att skriva i log-filen som ligger på http://min.hemsida.se/ och omedelbart redirecta till http://www.webforum.nu/.
Scriptet ger ingen output, mer än ett entry i log-filen, typ:
http://www.webforum.nu/*Tue Jan 7 15:31:02 2003
Testa själv, så ser du sedan att det inte går om du har en URL=<en http-sträng med ett "&" i sig>!
JojoxxMedlem sedan juni 20004 308 inlägg &-tecken *måste* kodas eftersom de används vid GET får att separera parametrar;
.../script.pl?namn=kalle&skostorlek=42&favoritmat=pizza
CGI.pm är en standardmodul i perl för att hantera vissa CGI-relaterade operationer, ex. GET;
use CGI;
$url=CGI::param("url");
sne1Medlem sedan jan. 200363 inlägg Jo, att & måste kodas (när man separerar parametrar) är jag med på, MEN i just detta fall finns det ett &-tecken i själva "texten", som INTE betyder "parameter-&".
Pelle's%2bStrul%2b%26%2bProblem
skall alltså egentligen vara
Pelle's+Strul+&+Problem
där & är ett &-tecken (en del av namnet "Pelle's Strul & Problem") och ingen parameterinledning.
Mottagarsidan (inte min...) MÅSTE få EXAKT "Pelle's+Strul+&+Problem" till sig, för att fungera.
Jag har även provat med att skicka
Pelle's%2bStrul%2b&%2bProblem (& som det är)
Pelle's%2bStrul%2b%%26%2bProblem (ett extra % före %26)
Pelle's%2bStrul%2b%25%26%2bProblem (ett %25 (="%") före %26)
men det går inte heller.
HJÄLP!?
Idéer någon?
JojoxxMedlem sedan juni 20004 308 inlägg "Pelle's%2bStrul%2b%26%2bProblem" är exakt "Pelle's+Strul+&+Problem" skickat via http-GET tar du emot det via CGI.pm så blir det rätt... Jag förstår inte var problemet är.
sne1Medlem sedan jan. 200363 inlägg Det är Gula Sidorna som spökar.
Ta vilket företag som helst, som har ett & i namnet.
T.ex. Smaskens Pizza & Grill.
Länken till informationen om företaget på Gula Sidorna är (direkt kopierat)
http://www.gulasidorna.se/query?what=map&mop=xx&mapcomp=RSID_12379549;192327;Smaskens+Pizza+%26+Grill;Stenungsundsg.+;2;;41674;G�TEBORG;031;21+52+55;1275710;6405384;0;1&mapstate=7;1275710;6405384;0;0;0;0;0;
vilket fungerar ypperligt i IE:s adressfält.
Men för att kunna skicka denna länk till mitt script, måste jag ändra &, +, ; m.fl. tecken till %26, %2b osv...
Och just i ett sådant här fall kommer det inte att fungera, eftersom & i själva NAMNET redan HAR ersatts med %26!
Någon som förstår?
Ännu bättre; någon som förstår och har en lösning?
:-)
HansenMedlem sedan aug. 2000374 inlägg Testa detta, klarar både korrekta (encodade) och felaktiga url´er:
click.pl?url=http://www.webforum.nu/showthread.php?s=&threadid=62664
click.pl?url=http%3A%2F%2Fwww.webforum.nu%2Fshowthread.php%3Fs%3D%26threadid%3D62664
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
my $q = new CGI;
if ( my $query = $ENV{'QUERY_STRING'} ) {
$query =~ s/url=//i;
$query =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
print $q->redirect($query);
}
else {
print $q->redirect('http://www.google.com/');
}
sne1Medlem sedan jan. 200363 inlägg Mjäää...
Nästan...
Testa själv med att anropa scriptet med
http://www.webforum.nu/cgibin/clicktest.pl?URL=http://www.gulasidorna.se/query?what=map&mop=xx&mapcomp=RSID_10888161;584745;Victoria's+Sol+%26+Sk%F6nhet;Marklandsg.+;7;;41477;G%D6TEBORG;031;41+00+77;1269142;6400864;0;0&mapstate=7;1269142;6400864;0;0;0;0;0;
jämfört med att BARA skjuta
http://www.gulasidorna.se/query?what=map&mop=xx&mapcomp=RSID_10888161;584745;Victoria's+Sol+%26+Sk%F6nhet;Marklandsg.+;7;;41477;G%D6TEBORG;031;41+00+77;1269142;6400864;0;0&mapstate=7;1269142;6400864;0;0;0;0;0;
i en browser.
Viss information (adress mm) tappas, eller hur!?
Detta BORDE ju inte vara alls svårt, eller...!?
HansenMedlem sedan aug. 2000374 inlägg Nopp ;o)
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
my $q = new CGI;
if ( my $query = $ENV{'QUERY_STRING'} ) {
$query =~ s/url=//i;
print $q->redirect($query);
}
else {
print $q->redirect('http://www.google.com/');
}
sne1Medlem sedan jan. 200363 inlägg Du tog bara bort raden
$query =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
eller?
Får du verkligen
http://www.webforum.nu/cgibin/clicktest?URL=http://www.gulasidorna.se/query?what=map&mop=xx&mapcomp=RSID_10888161;584745;Victoria's+Sol+%26+Sk%F6nhet;Marklandsg.+;7;;41477;G%D6TEBORG;031;41+00+77;1269142;6400864;0;0&mapstate=7;1269142;6400864;0;0;0;0;0;
att fungera?
Jag får Internal Server Error...
:-(
:-)
Jag tror att det bästa vore om man kunde angripa problemet i "botten".
Problemet är ju att länken till Gula Sidorna innehåller ett & som inte skall avkodas som annat än & och inte inledningen till en parameter.
Finns det beskrivet någonstans (specifikation) att "& inte får användas" i dessa sammanhang?
Eller står det snarare någonstans hur man kommer runt problemet?
Ungefär som när man måste skriva dubbla \\ för att få ett \ i andra sammanhang.
Den som löser detta är KUNGARNAS KUNG - på CGI, i alla fall...!
:-)
HansenMedlem sedan aug. 2000374 inlägg
Du tog bara bort raden
$query =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
eller?
Jepp, scriptet kommer inte att försöka omvandla eventuella hexadecimala tecken (%xx).
Får du verkligen [snip] att fungera?
Yes, här fungerar det utmärkt. Kommer till Victoria's Sol & Skönhet.
Testa igen:
click.pl?url=http://www.gulasidorna.se/query?what=map&mop=xx&mapcomp=RSID_10888161;584745;Victoria's+Sol+%26+Sk%F6nhet;Marklandsg.+;7;;41477;G%D6TEBORG;031;41+00+77;1269142;6400864;0;0&mapstate=7;1269142;6400864;0;0;0;0;0;
Vad får du för resultat?
HansenMedlem sedan aug. 2000374 inlägg JojoxxMedlem sedan juni 20004 308 inlägg Hom hom...
det som hamnar i miljödataarean (fin svensk omskrivning) $ENV{'QUERY_STRING'} är exakt den query-string som webbläsaren skickar vid förfrågan. Anropar du;
dittscriplt.pl?url=http://www.gulasidorna.se/query?what=map&mop=xx&mapcomp=RSID_10888161;584745;Victoria's+Sol+%26+Sk%F6nhet;Marklandsg.+;7;;41477;G%D6TEBORG;031;41+00+77;1269142;6400864;0;0&mapstate=7;1269142;6400864;0;0;0;0;0;
så hittar du;
url=http://www.gulasidorna.se/query?what=map&mop=xx&mapcomp=RSID_10888161;584745;Victoria's+Sol+%26+Sk%F6nhet;Marklandsg.+;7;;41477;G%D6TEBORG;031;41+00+77;1269142;6400864;0;0&mapstate=7;1269142;6400864;0;0;0;0;0;
i $ENV{'QUERY_STRING'}.
Men, eftersom det inte är en korrekt formaterad GET-sträng så plockar hansen bort den första förekomsten av "url=" med $query =~ s/url=//i;
Det som är kvar är alltså din URL som du skall vidarebefodra användaren till.
Finns det beskrivet någonstans (specifikation) att "& inte får användas" i dessa sammanhang?
Javisst, RFC2396.
sne1Medlem sedan jan. 200363 inlägg JA! Det fungerar!
Jag glömde (den andra gången) att sätta .pl-filen till executable...
Mitt PUCKO!
TACK!
Återstår bara att du förklarar, om du vill, ditt lilla script!?
1. Hur kan du fråga om $query är lika med något, innan $query HAR något värde?
Det sätts ju inte första gången förrän I if-satsen, EFTER att statementet testas, eller...!?
2. Vad betyder $ENV{'QUERY_STRING'}?
3. Vad innebär tilldelningen =~ s/url=//i;?
if ( my $query = $ENV{'QUERY_STRING'} ) {
$query =~ s/url=//i;
print $q->redirect($query);
sne1Medlem sedan jan. 200363 inlägg Jojoxx svarade under tiden jag frågade...
:-)
TACK båda två!
sne1Medlem sedan jan. 200363 inlägg Men jag fattar uppriktigt sagt inte hur det kan fungera bara genom att ta bort "url=" i min parameter (http-stringen som skall användas av scriptet för att redirecta)...?
Då borde väl även
.../cgibin/click.pl?http://www.gulasidorna.se/query?what=map&mop=xx&mapcomp=RSID_10888161;584745;Victoria's+Sol+%26+Sk�nhet;Marklandsg.+;7;;41477;G�TEBORG;031;41+00+77;1269142;6400864;0;0&mapstate=7;1269142;6400864;0;0;0;0;0;
fungera!?
Vilket det inte gör...
:-)
Fattar inte, och det är trots allt det viktigaste - att fatta vad man håller på med...!
HansenMedlem sedan aug. 2000374 inlägg Vi börajar med miljövariabler.
Exekvera detta script i din cgi-bin.
env.pl:
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
my $q = new CGI;
print
$q->header,
$q->start_html(
-title => 'Miljövariabler',
-style =>
{
-code => 'body, td { font-family: Verdana; }'
. 'td { padding: 5px; font-size: 8pt; }'
}
),
$q->start_table(),
$q->Tr( $q->td( { -colspan => 2 }, $q->h3('Miljövariabler') ) ),
$q->Tr( [ map { $q->td( [ $_, $ENV{$_} ] ) } sort keys %ENV ] ),
$q->end_table(),
$q->end_html;
Återkommer strax, måste bara röka..
*red: stavfel*