Perl-Script arbeitet einwandfrei, produziert aber trotzdem einen Error500
Frank
- perl
0 klaus0 Michael Schröpl0 gerhardi
Hallo,
ich bin kein Perl-Gott, bringe aber normalerweise ein fertiges Script konfiguriert und zum laufen. Nun habe ich ein Problem mit einem Script, welches Referrer URL`s logt. Das Script schreibt dabei die ermittelten URL's in ein Textfile.
Das Script selbst wird per SSL Aufruf gestartet:
<!--#include virtual="/cgi-bin/referrer/referrer.cgi" -->
Ich schwöre, dass Script schreibt das Logfile (referrer.txt )durch den SSL Aufruf völlig einwandfrei. Trotzdem erscheint im Browser an der Stelle, wo das SSL Aufruf ist eine Fehlermeldung:
[an error occurred while processing this directive]
Vielleicht ist ja ganz am Ende des Scriptes (siehe unten) ein kleiner Bug??
Wenn ich das Script direkt als URL im cgi-bin Verzeichnis in den Browser eingebe kommt ein Error500. Ein einfaches cgi debugger Script konnte keinen Fehler am refferer Script feststellen - und ich bin offensichtlich auch zu blöd dazu.
Weis von Euch vielleicht jemand was da falsch läuft?
Dank im voraus!
Grüße Frank
Hier das Script, wie ich es verwende:
$linkfile="referrer.txt";
$linked_site="Unbekannt";
$ignore="www.your-host.com";
# Set this to whatever address your site is at. This way the script will
# not log any links coming directly from your site.
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/~!/ ~!/g;
$FORM{$name} = $value;
}
open(LINKS,$linkfile)die "$linkfile doesn't look good";
@lines=<LINKS>;
close(LINKS);
foreach $link(@lines)
{
chomp($link);
($linker,$hits)=split(//,$link);
$linker_array{$linker}=$hits;
}
unless (($ENV{'HTTP_REFERER'} eq "") ((($ignore ne "") &&
($ENV{'HTTP_REFERER'}=~/$ignore/))))
{$linked_site=$ENV{'HTTP_REFERER'}}
$linker_array{$linked_site}++;
{@keys=sort {$linker_array{$a} <=> $linker_array{$b}} keys(%linker_array)}
open(LINKS,">$linkfile");
foreach $key(@keys)
{
print LINKS qq~$key$linker_array{$key}\n~;
}
close(LINKS);
1;
Hallo,
Ich bin ja kein fan von referer-logs oder so ('wir werden alle überwacht'), und mit SSI kenn ich mich auch nicht so richtig aus, aber der Server wird schon recht haben, daß da was schlimmes passiert ist ;-)
Weil wenn ein CGI_script gleich gar nichts zurückliefert, dann ist sicher was faul, und gibt halt mal Error 500 (Internal Server Error) aus.
Lösungen:
1.) referer-loging vergessen (empfohlen)
2.) Script gibt zumindest einen Header aus (falls 1. absolut keine Alternative ist)
Grüße
Klaus
Hi,
$linkfile="referrer.txt";
$linked_site="Unbekannt";
Äh - keine "#! /usr/bin/perl" oder so ähnlich in Zeile 1?
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
Das ließe sich mal wieder mit "use CGI" signifikant vereinfachen (nur, um die Übersicht bei der Fehlersuche zu erleichtern - bitte keine Performance-Diskussion, Wolfgang ;-).
open(LINKS,$linkfile)die "$linkfile doesn't look good";
Hm. Ein CGI-Skript, welches mit "die" aussteigt, ohne vorher einen HTTP-header geschrieben hat, wird Dich nicht dauerthaft glücklich machen.
open(LINKS,">$linkfile");
Und *das* soll also immer funktionieren? Noch nie eine volle Platte erlebt etc.?
Ach ja: Wie sicher bist Du Dir, daß das Problem nicht überhaupt im allgemeinen CGI-Installations-Bereich liegt?
http://www.teamone.de/selfaktuell/artikel/schroepl03.htm
mfG - Michael
so wie das script aussieht dürfte der Fehler auf
"premature end of script headers" lauten (bei apache). im Error-log des servers findest du genauere hinweise.
einfach am Schluss folgendes:
print "Content-type: text/html\n\n<html> </html>";
und es müsste laufen.
lg,
gerhard