Warum bekomme ich einen Server Error 500 / Software Error / ...?
Inhalt:
Dein Problem
Du hast ein CGI-Skript geschrieben, aber wenn Du es aufrufst, bekommst du eine Fehlerseite,
z.B.
Software Error
Execution of /pfad/zum/skript.pl aborted due to compilation errors.
oder etwas wie
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
und im Titel steht etwas wie '
500 Internal Server Error'. Eventuell steht im Text auch noch zusätzlich sowas wie
Premature end of script headers: ... dort.
Der Wortlaut der Meldung kann je nach Webserver und Admin variieren.
Du glaubst nun, du hast irgendetwas vergessen und hoffst, indem du obige Fehlermeldung
postest, kann dir jemand helfen.
Das Problem, Dir zu helfen
Kurz: nur mit dieser Fehlermeldung ist es schlicht unmöglich, Dir zu helfen (ausser ins
Blaue hinein raten). Es können sehr viele Gründe sein, die nicht alle etwas mit Perl zu
tun haben:
Dateirechte
z.B. sind evtl. die Rechte der Datei falsch gesetzt; dann hat Perl überhaupt nichts mit diesem Problem zu tun.
Stelle die Rechte der Datei auf ausführbar. Das sollte mit jedem FTP-Client gehn.
- Die Rechte sollten auf 755 gesetzt sein. Meistens wird genau diese Einstellung verlangt. Bei 777 wäre das Skript zwar auch ausführbar, aber meistens ist das zu "offen", da die Datei dann auch jeder Schreibrechte hat.
Shebang
oder die Shebang (erste Zeile im Skript) ist falsch und zeigt nicht auf (das richtige) perl.
Im Zweifel den Admin fragen, in die FAQ des Webhosters schauen. Übliche Werte sind:
#!/usr/bin/perl,
#!/usr/local/bin/perl
Script hat Syntaxfehler
Oder das Skript kompiliert nicht, d.h. es ist ein Syntaxfehler vorhanden.
Am besten prüft man die Syntax erst mal auf dem eigenen Rechner, bevor man es hochlädt.
Modul nicht vorhanden
ein Modul, dass du im Script benutzt, wird nicht gefunden, weil es z.B. kein Standard-Modul ist.
In dem Fall musst du es installieren, was nicht bedeuten muss, dass du root-Rechte brauchst;
die meisten Perl-Module lassen sich einfach in ein eigenes Verzeichnis kopieren.
Siehe
ModuleWieInstalliereIchEinModul
Kein Ascii-Format
Das Skript ist im falschen Format, weil es per ftp binär hochgeladen wurde anstatt in ASCII.
Auch das sollte sich mit jedem FTP-Client einstellen lassen.
Header fehlt
Du vergisst im Skript, einen Header auszugeben. Das erste, was in einem CGI-Script ausgegeben werden sollte, ist der HTTP-Header. Entweder:
use CGI; # ist ein Standardmodul!
my $cgi = CGI->new;
print $cgi->header;
oder
print qq{Content-Type: text/html\n\n};
Script stirbt während der Ausführung
Es kann auch sein, dass das Skript ausgeführt wird, aber dabei passiert ein fataler Fehler, der das Skript sterben läßt - auch dann bekommst du diesen Fehler. In diesem Fall hilft es oft, wenn man am Anfang des Skriptes schreibt:
use CGI::Carp qw(fatalsToBrowser);
Dadurch wird in vielen Fällen statt des 500er-Fehlers der Perl-Fehler angezeigt.
Weitere wichtige Dinge
Warnungen im Browser ausgeben
Häufig passiert es auch, dass es keinen Fehler gibt, aber eine Warnung. Um die Warnungen zu sehen, muss man folgendes machen:
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
use CGI;
my $cgi = CGI->new();
print $cgi->header();
warningsToBrowser(1); # dies ist wichtig und muss nach dem Header kommen!
Logdateien studieren
Ansonsten gilt für CGI-Skripte: ohne
error_log geht gar nichts. Frag Deinen
Admin, wo das ist oder zur Not lege Dir selbst eins an (was aber wiederum nur
geht, wenn das Skript überhaupt läuft). Selbst anlegen geht so:
# oben im skript
open STDERR, ">>/pfad/zum/skript/skript.log" or die $!;
Je nach den Rechten im Verzeichnis musst du die log-datei auch zuerst manuell anlegen
und ihr die nötigen Rechte geben, damit der Webserver sie öffnen und schreiben kann.
Falls du Fehlermeldungen aus dem Errorlog bei deiner Frage postest, dann poste bitte
alle,
die zu einem Aufruf gehören.
Allgemein solltest du auch immer darauf achten, dass
- du dich im cgi-bin-Verzeichnis befindest (oder je nach Konfiguration/Provider/etc. anders). Wenn Du Dir hier nicht sicher bist, kannst du das aber rausfinden: einfach
use Cwd; my $pfad = cwd(); ins Skript schreiben. In $pfad steht nun das Verzeichnis, in dem du gerade bist. Alle anderen Pfade, die Du relativ von hier ansprichst, müssen also in Beziehung zu $pfad gesetzt werden.
- Bei vielen Providern können nur CGI-Skripte im cgi-bin-Verzeichnis liegen, aber z.B. keine HTML-Dokumente, Bilder oder css-Dateien.
- Als CGI-Skript wird Dein Skript vom Webserver gestartet. Der hat natürlich ganz andere Rechte (und auch Umgebungsvariablen) als Du. Achte also darauf, dass z.B. bei Datei-Operationen genügend Rechte vorhanden sind (aber auch nicht zu viele!!). Normalerweise ist chmod 755 das, was Du brauchst.
Weitere Hilfen
Eine weitere Checkliste von Martin H. Sluka findest Du hier:
http://www.worldmusic.de/perl/checkliste.html
--
TinaMueller,
ReneeBaecker,
HaraldBongartz