Beheben eines ‚Internal Server Error‘
Hallo Constantin!
Ich habe auf meiner WebSite im Verzeichnis /cgi-bin ein ganz
einfaches Uhrzeit-Perl-Script sowohl als uhr.pl als auch
uhr.cgi gespeichert. Zugriffsrecht ist 755. Upload mit ASCII
hat problemlos funktioniert.
Sobald ich mit dem Internet Explorer direkt darauf zugreife
(domain/cgi-bin/uhr.pl bzw …/uhr.cgi) erhalte ich die
Fehlermeldung „500 Internal Server Error“.
Wer kann mir meinen Fehler sagen? Kann ich mit dem Webbrowser
vielleicht nicht direkt auf CGI’s zugreifen? Wenn ja, wie
macht man es dann?
Wenn der Perl-Code an sich, sowie die Dateirechte OK sind und
dennoch ein Internal Server Error erscheint, liegt es meist
daran, dass die erste Zeile des Perl-Skripts nicht in Ordnung
ist, d.h. entweder der Pfad zum Perl-Interpreter ist falsch oder
am Ende der Zeile steht ein für den Server falsch codiertes
Newline. Dies entsteht z.B. bei der FTP-Übertragung im
Binärmodus von einem Windows- auf einen Linuxrechner.
Wenn Du Telnet-Zugang hast, kannst Du das Skript unter Linux
in der Form ./uhr.pl aufrufen, um zu testen, ob die erste Zeile
Deines Skripts korrekt ist.
Im folgenden hab ich Deinem Skript ein paar Zeilen hinzugefügt,
um es „fehlerresistenter“ zu machen:
#!/usr/bin/perl -w --
# nützliche Kommandozeilenschalter:
# -w = Warnungen ausgeben lassen
# -- = alles was dahinter kommt ignorieren (z.B. "kaputte"
# Newline-Zeichen!)
# Schutz vor Tippfehlern: Variablen müssen mit my deklariert
# werden
use strict;
# Fehlermeldungen im Browser anzeigen:
# TIPP: wenn trotz use CGI::Carp ein Internal Server Error angezeigt wird,
# liegt der Fehler definitiv an den Zeilen davor, meist ist der Pfad
# zum Perl-Interpreter falsch bzw. enthält für den Server ungültige
# Newlines
use CGI::Carp "fatalsToBrowser";
# print-Anweisungen sofort (ohne Zwischenspeichern) ausgeben
# lassen, damit der HTTP-Header unverzüglich zurückgesendet wird:
$|=1;
#
# Datum und Uhrzeit wird berechnet.
#
my ($sek,$min,$h,$mtag,$monat,$jahr) = localtime(time);
$jahr += 1900; # zu Jahr 1900 dazuzählen.
$monat += 1; # startet bei 0
#
# Ausgabe als HTML.
#
# ACHTUNG bei Hier-Dokumenten:
# das EOM am Ende muss direkt mit einem Newline enden und darf
# keine weiteren Leerzeichen enthalten, denn "EOM " ist nicht
# das gleiche wie "EOM"!
print 1. CGI-Programm
Hier war es gerade
$h Uhr $min und $sek Sekunden.
Das Datum ist: $mtag.$monat.$jahr.
EOM
# und aus"
Gruß,
-Andreas.