500 Internal Server Error

Hallo!

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.

Quellecode:

#!/usr/bin/perl

Datum und Uhrzeit wird berechnet.

($sek,$min,$h,$mtag,$monat,$jahr) = localtime(time);

$jahr += 1900; # zu Jahr 1900 dazuzählen.
$monat += 1; # startet bei 0

Ausgabe als HTML.

print 1. CGI-Programm

Hier war es gerade
$h Uhr $min und $sek Sekunden.

Das Datum ist: $mtag.$monat.$jahr.

EOM

und aus"

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?

Danke,

Constantin

Hi Constantin,

das Script ist formal korrekt.
Füge mal als 2. Zeile ein:
use CGI::Carp qw(fatalsToBrowser); # Fehler im Browser melden
und schau mal ob du eine detailliertere Fehlermeldung bekommst.

Auf manchen Servern gibts Probleme mit dem HTTP-Header (Content-type…), dann sollte es aber gehen, wenn man den Header vom CGI-Modul schreiben lässt.
Hast du auch den korrekten Pfad im Browser eingetippt? Wenn Scripte nicht gefunden werden gibts i.d.R. auch 500 statt 404 Error…

schönen Gruß
Ingo

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.

Hallo Constantin und Andreas!

Nur noch 'ne Anmerkung aus der Praxis: mit
use strict;
werden viele Scripte, die man so zum runterladen oder „abtippen“ findet nicht funktionieren, man ist halt nicht immer so sorgfältig wie’s in der Theorie sein sollte.
Was dann aber nicht heißt, dass das Programm „falsch“ wäre (pragmatisch gesehen)…
Gruß Ingo