Cookie setzen, aber danach weiterleiten ?
xNeTworKx
- perl
Hallo,
Ich hab da folgendes Problem. Auf meiner hp habe ich eine kleine Wahl zu meiner Seite, Excellent. good, bad usw. Ich schreibe hierzu jeweils a, b, c, d usw auf ein Flat File und setze ein Cookie, sodaß man nicht doppelt voten kann. Nun soll das Script aber nach dem setzen des Cookies weiterleiten, was aber irgendwie nicht geht, da ich ja print $query->header(-cookie=>$cookie); habe und somit einen Header ausgebe, was mir wiederum Steine in den Weg wegen $query->redirect legt.
Wie kann man das auf irgendeine Weise umgehen ?
Ich hab die Weiterleitung bis jetzt mit JavaScript gemacht, aber das kann es doch nicht sein ?
Ich poste mal das (vielleicht etwas beschämende) Script.
#!/usr/bin/perl -w
use CGI;
$query = new CGI;
$data = "b";
$cookie = $query->cookie(-name=>'vote',
-value=>'on',
-expires=>'+1095d',
-path=>'/');
print $query->header(-cookie=>$cookie);
print "<html><head><title>good</title></head>\n";
print "<body>\n";
open(STAT,">>vote.txt") or die "There is an error, please try again";
flock STAT, 2;
print STAT $data;
close STAT;
print "<script language="JavaScript">\n";
print "window.location.href="vote_umleitung.html"\n";
print "</script>\n</body>\n</html>\n";
Hi,
Nun soll das Script aber nach dem setzen des Cookies weiterleiten, was aber irgendwie nicht geht, da ich ja print $query->header(-cookie=>$cookie); habe und somit einen Header ausgebe, was mir wiederum Steine in den Weg wegen $query->redirect legt.
durch die Tür, linke Reihe, jeder Response nur ein Header. Dieser kann allerdings "Set-Cookie:" _und_ "Location:" enthalten, was der cookie()- bzw. redirect()-Methode von CGI.pm entspricht.
Erweitere also einfach die Parameter Deines header()-Aufrufs. perldoc CGI
sagt Dir mehr dazu.
Ich hab die Weiterleitung bis jetzt mit JavaScript gemacht, aber das kann es doch nicht sein ?
Nein, in der Tat... wenigstens ein <meta>-Refresh hätte es sein können :-)
Ich poste mal das (vielleicht etwas beschämende) Script.
Eigentlich ist es gar nicht schlecht; es ist im Gegenteil sogar ziemlich gut. Ich hab nur wenige Anmerkungen:
#!/usr/bin/perl -w
use strict; # Und dadurch musst Du schreiben:
$query = new CGI;
my $query = new CGI;
Mit strict vermeidest Du viele Fehler. Welche das sind sagt es Dir, wenn Du das Script einfach mal mit use strict;
versiehst und testweise ausführst.
$data = "b";
Hier reichen Singlequotes. Es ist nicht nötig, den Perl-Interpreter nach zu ersetzenden Variablen u.ä. suchen zu lassen.
open(STAT,">>vote.txt") or die "There is an error, please try again";
In den die
-Text solltest Du die Variable $! einbauen, um die Ursache des Fehlers mitzubekommen.
print "<script language="JavaScript">\n";
print "window.location.href="vote_umleitung.html"\n";
print "</script>\n</body>\n</html>\n";
Es ist sicher nicht schlecht, wenn Du Dich mit Here-Documents beschäftigst. Dadurch vermeidest Du die vielen " und \n, und der HTML-Code steht gut lesbar innerhalb des Perl-Codes.
Cheatah
Hallo,
hmmm perldoc CGI is auch nicht grad hilfreich, da steht nur drin wie man umleitet usw.
Meinst du mit header erweitern so ?
#!/usr/bin/perl -w
use CGI;
$query = new CGI;
$data = "b";
$cookie = $query->cookie(-name=>'vote',
-value=>'on',
-expires=>'+1095d',
-path=>'/');
$url = "http://www.usw.usw";
print $query->header(-cookie=>$cookie);
(-redirect=>$url);
open(STAT,">>vote.txt") or die "There is an error, please try again";
flock STAT, 2;
print STAT $data;
close STAT;
(Kann momentan nicht online testen, da Server ausgefallen is, deswegen frag ich jetzt)
Hi,
Meinst du mit header erweitern so ?
#!/usr/bin/perl -w
use strict;
print $query->header(-cookie=>$cookie);
(-redirect=>$url);
Nein; erstens sollte es schon syntaktisch korrekt sein ;-) (orientiere Dich am cookie()-Code), und zweitens lautet der HTTP-Header für einen Redirect nicht "Redirect", sondern "Location".
(Kann momentan nicht online testen, da Server ausgefallen is,
Wie - Du hast _kein_ Perl bei Dir lokal installiert?! Das solltest Du ändern.
Cheatah
Hallo,
Nein; erstens sollte es schon syntaktisch korrekt sein ;-) (orientiere Dich am cookie()-Code), und zweitens lautet der HTTP-Header für einen Redirect nicht "Redirect", sondern "Location".
Ich blick durch das ganze geHeadere schön langsam erst durch =)
(Kann momentan nicht online testen, da Server ausgefallen is,
Wie - Du hast _kein_ Perl bei Dir lokal installiert?! Das solltest Du ändern.
Wenn du nur 30MB freien Platz auf da HD hättest, glaub ich würdest du auch an allen nicht so notwendigen Sachen sparen.
(Hab leider nur einen Pentium 1 =) (gott sei dank nimma lang))
Hi,
Ich blick durch das ganze geHeadere schön langsam erst durch =)
dann verweise ich Dich besser nicht auf RFC 2616 (http://www.ietf.org/rfc/rfc2616.txt), der dieselben definiert ;-)
Ernsthaft: Jeder Response des Servers (z.B. durch Dein Script generiert), egal ob HTML-Dokument, Grafik oder Fehlermeldung, besteht aus Header und Body. Die beiden sind eindeutig getrennt durch die erste "echte" Leerzeile. Das kann beispielsweise so aussehen:
--- begin ---
Status: 200 OK
Content-type: text/plain
Content-length: 21
Server: Apache/1.3.12 (Unix) mod_php
Expires: Thu, 08 Nov 2001 09:04:11 GMT
Dies ist die Antwort.
--- end ---
Um die meisten Header brauchst Du Dich nicht zu kümmern, die setzt der Server schon richtig. Aber gerade die Kombinationen von Statuscodes mit möglichen oder nötigen weiteren Headern sind schon recht wissenswert.
Wie - Du hast _kein_ Perl bei Dir lokal installiert?! Das solltest Du ändern.
Wenn du nur 30MB freien Platz auf da HD hättest, glaub ich würdest du auch an allen nicht so notwendigen Sachen sparen.
Nein, ich würde mir eine neue Festplatte kaufen ;-)
Cheatah