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

UtilFaqSubForm edit

Titel Warum bekomme ich einen Server Error 500 / Software Error / ...?
Autor TinaMueller
Bereich FaqCGI
Tags CGI, Server Error, 500, Premature End, Header
Topic revision: r12 - 2008-05-19 - 12:07:48 - ReneeBaecker
 
Bitte die NutzungsBedingungen beachten.
Bei Vorschlägen, Anfragen oder Problemen mit dem PerlCommunityWiki bitten wir um WebBottomBarExample">Rückmeldung.