Premature end of script header, CGI Skript

Seiler

Seiler

Aktives Mitglied
Thread Starter
Dabei seit
05.04.2005
Beiträge
244
Reaktionspunkte
2
Hi,

ich möchte ein bereits erstelltes CGI Skript unter meinem Apache (localhost) laufen lassen. Die Rechte sind soweit ok, denke ich (755), und andere CGI Skripte funktionieren auch. Als Fehler auf der Seite bekommen ich einen "Internal Server Error" und in der log ein "Premature end of script header" Fehler. Wenn man das Skript im Terminal startet, so wird es ohne Fehlermeldung ausgeführt. Hat jemand von euch eine Idee?

Gruß

Michael

P.S.: Wie man merkt, hab ich von dem Kram nicht so wirklich Ahnung und versuche mich etwas einzuarbeiten, daher bitte ich bei der Beantwortung um Nachsicht :D
 
Dem Fehler entnehme ich es geht um Perl!?

Neben den Rechten müssen auch User und Grupper passend zu suexec gesetzt sein un der SheBang am Anfang muß verifiziert sein. Der Fehler ist hier beschrieben, vor allem der Link zu SuSExec ist sicher nicht unwichtig:

http://httpd.apache.org/docs/1.3/misc/FAQ-F.html
 
  • Gefällt mir
Reaktionen: Seiler
Hi, danke für deine antwort, kann aber irgendwie nicht ganz den Zusammenhang zwischen suEXEC und meinem problem sehen. Warum funktionieren dann eigentlich einige Skripte, dieses eine nicht? Hab auch irgendwie nichts passendes in der Apache config gefunden...

Gruß

Michael
 
ich mache nur noch wenig mit Perl, kann daher auch nur beschränkt helfen. Aber schon dier erste ergooglete Antowrt liefert das hier:

http://www.perlunity.de/perl/forum/thread_017345.shtml

Dort am Ende steht das Gleiche wie im link oben. Es gibt noch mehr Treffer der Art. Daher kann es so falsch nicht sein. Paßt das denn alles wie dort aufgeführt!?
 
Ok, dann liegt der Fehler wohl da, aber leider kann ich mit den Beschreibungen nichts anfangen, da sie mir alle nichts sagen, leider :(
Ferstehe nur nicht wieso andere Skripte funktionieren, ist doch irgendwie unlogisch, oder?

Gruß

Michael
 
was heisst "im terminal starten"? wie machst du das? perl skript.pl oder ./skript.pl?
neben den rechten und benutzer/gruppe (denke, das hast du passend abgeglichen), gibt es noch einen klassiker (meist bei windows benutzern): die datei liegt im "DOS"-format mit \n\r fuer einen zeilenumbruch vor. damit findet das betriebssystem den passenden interpreter (in diesem fall) perl nicht - holt er sich aus der ersten skriptzeile in der form #!/usr/bin/perl (da stuende dann z.b. #!/usr/bin/perl^M) - also am besten mal im unix-format abspeichern.

bist du sicher, dass alle module die per use xxx; eingebunden wurden auch auf dem server existieren?

ansonsten: wenn du zugriff auf die error-log hast unbedingt anschauen. denn dort findet sich meist der passende hinweis - zumindest richtung in die man weiter suchen kann...

markus
 
  • Gefällt mir
Reaktionen: Seiler
Hi Dank euch allen.
Also ich hab das problem lokalisiert und es lag wie so oft zwischen zwei Schultern und nannte sich Kopf, meiner um genau zu sein! :D

Das einzubindende Skript war nicht von mir und in der shebang fehlte das -w, was anscheindend keine Auswirkungen auf perl xxx.cgi aber wohl auf ./xxx.cgi hat. Kenn mich nicht genug aus, als dass ich wüsste warum ? :confused: geändert und alles klappt...

Gruß

Michael
 
Ich habe mir das mal angesehen. Leider habe ich schon lange nichts mehr mit Perl gemacht und somit ist mein Wissen etwas eingerostet.

Code:
#!/usr/bin/perl -w

use CGI;
use CGI::Carp qw( fatalsToBrowser);
my $q = CGI->new();

print $q->header('text/html');
print 'Hallo Welt';
Bei CGI Skripts habe ich immer die 2 Befehle noch benutzt:start_html() und end_html()

start_html() generiert folgende Zeilen:
HTML:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html
        PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US"><head><title>Untitled Document</title>
</head><body>

end_html() :
HTML:
</body></html>

Ich weiß zwar nicht ob das irgendetwas mit dem Problem zu tun hat, aber wollte es trotzdem mal erwähnen. =)
 
Wie bereits erwähnt ist mein Problem soweit gelöst...

Gruß

Michael
 
Ja, aber nicht optimal.
-w ist veraltet und sollte durch die Zeile
an passender Stelle ersetzt werden (Am besten noch ergänzt durch "use strict")
Außerdem sollte man beides entfernen, wenn man mit der Entwicklung des Skriptes fertig ist. Ansonsten schluckt es nur Ressourcen ohne etwas nützliches zu bewirken.


Abgesehen davon, kann ich keinen Zusammenhang zwischen dem "-w" und Dem genannten Fehler ekennen. Leider hast Du keinen Codeausschnitt gepostet, also kann man letztendlich nicht wirklich viel sinnvolles zum Fehler selbst sagen.
 
Wie bereits beschrieben, kann ich nur sagen, dass es funktioniert hat. Warum ist mir auch schleierhaft. Ich hab ausschließlich das -w geändert und dann hat es funktioniert. Mehr kann ich leider auch nicht sagen...

Gruß

Michael
 
Wenn Dir das so reicht.

Jedenfalls hat der Schalter -w nicht das Geringste mit einem "premature end ..." Fehler zu tun.
Wie ich oben schon erwähnte, ist dieser Schalter auch primär für Entwicklung gedacht und hat in einem fertigen und ausreichend getesteten Skript nichts mehr zu suchen. Ich würde fast wetten, dass das Skript jetzt auch laufen würde, wenn Du das -w wieder entfernst.
 
Also, ich hab das gerade getestet und ohne das -w erzeugt er den Fehler...
ist also reproduzierbar...

Gruß

Michael
 
mh,
das ist seltsam. -w bewirkt eigentlich nur, dass "warnungen" in die error-log geschrieben werden. das ist waehrend der entwicklung sinnvoll, im produktiv-einsatz sollte der schalter nicht gesetzt sein, wie maceis schon sagte...

auf meinem server ist -w auch unschaedlich!

was passiert, wenn du z.B.
Code:
print STDERR "Hallo Test\n";
in deinem script eingibst. auch ein fehler?


markus
 
Sag ich ja auch, sehr seltsam.
Also wenn ich den Code einfüge ändert sich nichts...

Gruß

Michael

P.S.: Ich hab den Code wie gesagt nicht selbst geschrieben, sondern nur hier im Forum "empfohlen" bekommen...
 
Du könntest noch folgendes machen.
Füge ganz am Anfang Deines Skriptes (zweite Zeile) folgende Zeile ein
Code:
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
und rufe das Skript auf.
Möglicherweise sieht man dann, was dass eine Warnung ausgegeben wird und kommt so dem eogentlichen Fehler auf die Spur.
 
Also in dem Skript befindet sich: use CGI qw:)all);. Wenn ich das auskommentiere und in der ersten Zeile wie gepostet use CGI::Carp qw(warningsToBrowser fatalsToBrowser); benutzte
kommt ein Fehler dass er eine Subroutine im Skript (Undefined subroutine &main::header called at /Users/XXXXXXX/Sites/cgi-bin/modules.cgi line 96.) nicht aufrufen kann. Wenn ich beider drinnen lasse, dann funktioniert das Skript...


Gruß

Michael
 
Ach, es geht um "mein" Script :eek:

Ändere mal die erste Zeile zu einem #!/usr/bin/perl -w ab,
dann klappts.
 
Ist doch klar, dass Du ein Modul nicht benutzen kannst, das Du nicht geladen hast, Seiler.
Außerdem werden die subs "fatalsToBrowser" und "warningsToBrowser" mit CGI(all) nicht importiert sondern müssen in jedem Fall separat eingebunden werden (gehören Sie ja auch zu einem anderen Modul).

Abgesehen davon, wozu soll der Doppelpunkt in "use CGI qw:)all)" gut sein?
Und was ist das für ein Skript, das nur mit -w läuft und sonst nicht?!
 
Ach, es geht um "mein" Script :eek:

Ändere mal die erste Zeile zu einem #!/usr/bin/perl -w ab,
dann klappts.

Ja, es geht um dein Skript :D
hab ich bereits gemacht, mir ist nur der Grund des Fehlers nicht bewußt...

Gruß

@maceis Das kann ich dir auch nicht sagen, ich weiß nur das es mit CGI qw(all) und -w geht und mit CGI::Carp qw(warningsToBrowser fatalsToBrowser) eben nicht. Ich habs nicht geschrieben und mich auch nicht tiefer damit auseinandergesetzt...;)
 
Zurück
Oben Unten