ibkaler: Premature end of script headers

Hallo.

Ich habe ein Problem mit einem Perl-Script.
Es handelt sich dabei um ein Such-Script, das, wenn es einen Suchbegriff findet, einwandfrei läuft. Wird ein Suchbegriff nicht gefunden, bricht das Script ab und es kommt folgende Fehlermeldung:
"Premature end of script headers"
Auf einem T-online Server ist es komplett einwandfrei gelaufen, nun habe ich einen Provider-Wechsel unternommen und auf diesem Server macht das Script oben genannten Fehler.
Habe auch schon mit Text-Pad dieses Script auf Unix abgespeichert. Die Rechte stimmen auch.

Könntet Ihr mir da bitte helfen?.

Für Eure Mühe danke ich Euch schon im Voraus.

Hier das Script:

#!/bin/perl -w

print "Content-type:text/html\n\n";

use CGI::Carp(fatalsToBrowser);

$directory="/htdocs/www/";

$url="http://www.wollaberg.de/";

read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $buffer);
  foreach $pair (@pairs) {
    ($name, $value) = split(/=/, $pair);
    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    $FORM{$name} = $value;
}

@ORIG=("Ü","Ä","Ö","ü","ä","ö","ß");
@SUBST=("Ü","Ä","Ö","ü","ä","ö","ß");

for ($i=1; $i<3; $i++) {
 $string="qry$i";
 for ($x=0; $x<7; $x++) {
  $FORM{$string} =~ s/$ORIG[$x]/$SUBST[$x]/g;
 }
}

push(@DIRS, "$directory");

opendir(TEMP, $directory);
while($file = readdir(TEMP)) {
 push(@DIRS, "$directory$file/") if -d $file && $file ne ".." && $file ne "." && $file !~ /^_/ && $file ne "cgi-bin";
}

close (TEMP);

foreach $dirs (@DIRS) {
        chdir($dirs);
 opendir(TEMP, $dirs);
 while($file = readdir(TEMP)) {
  push(@FILES, "$dirs$file") if -T $file;
  push(@DIRS, "$dirs$file/") if -d $file && $file ne ".." && $file ne "." && $file !~ /^_/ && $file ne "cgi-bin";
 }
 close (TEMP);
}

foreach $FILE (@FILES) {
   $counter{$FILE}++;
}

foreach $FILE (sort keys(%counter)) {
 push(@SORTFILES, $FILE);
}

@FILES=@SORTFILES;

chdir($directory);

foreach $FILE (@FILES) {
 open(FILE, "$FILE");
 @LINES= <FILE>;
 close(FILE);
 $string = join(' ', @LINES);
 $string =~ s/\n//g;
 if ($FORM{operator} eq "und") {
  if ($string =~ /$FORM{qry1}/i && $string =~ /$FORM{qry2}/i ) {
   $include{$FILE} = "yes";
  }
  else {
   $include{$FILE} = "no";
  }
 }
 if ($FORM{operator} eq "oder") {
  if ($string =~ /$FORM{qry1}/i || $string =~ /$FORM{qry2}/i) {
   $include{$FILE} = "yes";
  }
  else {
   $include{$FILE} = "no";
  }
 }
 if ($string =~ /<title>(.*)</title>/i && $1 ne "") {
  $titles{$FILE} = "$1";
 }
 else {
  $ausgabe=$FILE;
  $ausgabe =~ s/^$directory//;
  $titles{$FILE} = "$url$ausgabe";
 }
}

print <<marke1;
<html>
<head>
<title>Suchergebnisse</title>
<copyright by Roland Plank>
<style type="text/css">

</style>
</head>
<body text="#000000" bgcolor="#CCFFFF" link="#990066" vlink="#990066" alink="#990066">

<p><center>
<table>
<tr>
<td>
<font size=+1><b>Suchergebnisse in der Datenbank Wollaberg
</td>
</tr>
</table>
</center>
<p><br><p><br>
<center>
<table border=1 width=95%>
<tr>
<td>
<ul>
<b><font size=4>Es wurde gesucht nach: <i>$FORM{qry1}</i>
marke1
if ($FORM{qry2} ne "") {

$FORM{operator} =~ tr/a-z/A-Z/;
 print "$FORM{operator} $FORM{qry2}\n";
}
print <<marke2;
</b>
<p>
<font size=3>Fundstellen in folgenden Dateien:<p>
<font size=3>
<ul>
marke2
foreach $FILE (@FILES) {
 if ($include{$FILE} eq 'yes') {
  $y++;
  $ausgabe = $FILE;
  $ausgabe =~ s/^$directory//;
  print "<a href="$url$ausgabe"><b>$titles{$FILE}</a></b><br>\n";
}
}
if ($y==0)
{
print "<b><font color=red>Leider keine Entsprechungen gefunden!</font></b><br>\n";
}
print "<p></td></tr></table><p>
<font size=-1>
<br>
<a href='javascript:history.back()'>zurück</a>
<p></body></html>\n";

  1. hi,

    Ich habe ein Problem mit einem Perl-Script. Es handelt sich dabei um ein Such-Script, das

    ... stark danach aussieht, als ob es vor gaaaanz langer Zeit mal das "search.pl" von Matt Wright (1996) gewesen wäre ;-) Du hast es bloß sehr fleißig umgebaut. Dabei aber vergessen, wie Matt W. dieses Problem seinerzeit gelöst hatte.

    Auf einem T-online Server ist es komplett einwandfrei gelaufen

    Wiebitte? Das ist mir völlig neu, daß t-online eigene scripts zuläßt. Kannst du das mal bitte erklären, wie du das angestellt hast? Ich wäre ziemlich glücklich, wenn ich eigene Scripts bei t-online einsetzen könnte.

    Könntet Ihr mir da bitte helfen?

    Naja, versuchen kann ich es, aber obs was nutzt ...

    foreach $FILE (@FILES) {
    open(FILE, "$FILE");
    @LINES= <FILE>;
    close(FILE);
    $string = join(' ', @LINES);
    $string =~ s/\n//g;

    Diese Zeilen sind noch _original_ bei Matt Wright abgeschrieben ;-)
    Und die nachfolgende Konstruktion folgt exakt dem "alten" Konzept. Du mußt aber beachten, daß du für $include{$FILE} manchaml "yes" und manchmal "no" erhältst  -  das hast du nämlich später nicht mehr beachtet.

    Hier kommts, wenn du deine Bildschirmausgabe machst:

    foreach $FILE (@FILES) {
    if ($include{$FILE} eq 'yes') {
      $y++;

    Das geht noch in Ordnung, das heißt, gibts den Suchbegriff, wird er auch gefunden. Aber wenig später:

    if ($y==0) {
    print "<b><font color=red>Leider keine Entsprechungen gefunden!

    Das kann eigentlich nicht klappen, weil deine Variable $y nichts mit deinem Suchstring zu tun hat (falls ich das richtig sehe). Die ursprüngliche Konzeption sieht vor, daß hier   -    naja, gar nichts passiert. Es ist nicht vorgesehen, daß ein Suchbegriff nicht existiert.
    Du mußt also irgendwo "höher" in deinem Script ansetzen, wo dein Suchstring mit dem eingegebenen Suchbegriff verglichen wird. Also ungefähr so etwas:
      if (!($string =~ /$FORM{qry2}/i))
      print "Leider keine Entsprechungen gefunden"
    Oder du steckst dieses "if" noch in die darüberstehende "foreach"-Abfrage hinein.

    Dein Problem könnte aber auch noch woanders liegen. Du löst am Anfang eine ganze Reihe von Suchläufen durch unterschiedliche Verzeichnisse in Arrays auf. Wenn deine Verzeichnisstruktur damit nicht mehr übereinstimmt, könnte ein ähnlicher Fehler entstehen.

    Sicher bin ich mir bei diesem Deutungsversuch nicht. Aber ich hatte vor kurzer Zeit ein ganz ähnliches Problem und bin bei deutlich bescheidenerer Suchanfrage nach dieser "Logik" vorgegangen  -  das heißt, wird der vom Suchformular her übernommene Begriff im Suchstring nicht gefunden (mit dem entsprechenden RegExp.) gibts den entsprechenden Hinweis und mit exit wird das ganze Script beendet.

    Grüße aus Berlin

    Christoph S.

    1. Hallo!
      Zuerst einmal vielen Dank für deine Antwort.

      Stimmt. Es war mal dieses Script, das ich vor Jahren mal runtergeladen und geändert habe.  :-)))

      Bei T-Online habe ich Module dazugemietet, um eigene Scripts einsetzen zu können. Nur leider ist T-Online soooo teuer geworden, dass ich nach Kontent.de gewechselt bin. Um vieles billiger; PHP, PERL, MYSQL inclusive.

      Werde deine Ratschläge befolgen und werde hoffentlich diesen Fehler ausmerzen können.

      Vielen Dank nochmal für die Ratschläge.

      Viele Grüße aus Wollaberg

      Roland

      1. hallo Roland,

        Stimmt. Es war mal dieses Script, das ich vor Jahren mal runtergeladen und geändert habe.  :-)))

        Kannst mal sehen, das Forum hier kriegt alles raus ;-)

        Bei T-Online habe ich Module dazugemietet, um eigene Scripts einsetzen zu können. Nur leider ist T-Online soooo teuer geworden

        Oh. Dann entfällt das natürlich. Ich habe, weil ich meine DSL-Flatrate bei t-online habe, seit rund zwei Jahren auch die üblichen 10 MB Webspace dort. Irgendwelche Module dazuzumieten, würde mir eh nicht einfallen. Also muß ich wohl weiterhin zu meinen Scripts bei anderen ISP's greifen. Macht ja nix.

        Werde deine Ratschläge befolgen und werde hoffentlich diesen Fehler ausmerzen können.

        Ich mache mal etwas, was ich außerordentlich selten mache (weil es in gewisser Weise dem SELF-Prinzip widerspricht): ich hänge dir ein kleines Suchscript an, das ebenfalls aus dem alten Matt-Wright-Script entwickelt wurde (dürfte allerdings schwerer zu bemerken sein) und gut funktioniert. Allerdings müßtest du natürlich deine ganzen Arrays da wieder reinstopfen, aber vielleicht genügt es als Vergleich. Es hat den Vorteil, daß es bereits ganz auf das CGI-Modul setzt, was du noch nicht drin hast.
        Im Eingabeformular hat das input-Feld für den Suchbegriff den Namen "begriff", daher kommt die im Script eingesetzte Variable, und da es zunächst auf einer Windows-Kiste gelaufen ist, sieht die shebang eben so aus, wie sie aussieht.

        ---Beispiel---

        #!D:/Perl/bin/perl.exe -w
        use strict;
        use CGI;
        my $cgi = new CGI;
        use vars qw(
          $basedir $baseurl $css
          $begriff $dateien @dateinamen
          @liste @liste1 $liste $string $link @links
          %name $name %namen $namen $zeile
          @ausdruecke $ausdruck
          %include $include $key $titel @titel $text
        );
        $basedir = 'I:/root/forum/beitraege';
        $baseurl = 'http://pc1/online/forum/beitraege';
        $css     = 'http://pc1/online/scripts/forum.css';
        if (defined $cgi->param('begriff')) { $begriff = $cgi->param('begriff'); }

        opendir(VERZ,"$basedir") || die $!;
        for $dateien (grep {/.htm/} readdir VERZ) { push(@dateinamen, $dateien);}
        closedir(VERZ);

        foreach $name (@dateinamen) {
           open(LISTE,"$basedir/$name") || die $!;
           @liste1 = <LISTE>;
           close(LISTE);
           foreach $zeile (@liste1) { push(@liste, $zeile);}

        $string = join(' ',@liste1);
           $string =~ s/\n//g;
           $liste = join(' ',@liste);
           @ausdruecke = split(/\s+/,$begriff);

        if ($begriff) {
              foreach $ausdruck (@ausdruecke) {
                 $ausdruck =~ s/ä/&auml;/g;
                 $ausdruck =~ s/ö/&ouml;/g;
                 $ausdruck =~ s/ü/&uuml;/g;
                 $ausdruck =~ s/Ä/&Auml;/g;
                 $ausdruck =~ s/Ö/&Ouml;/g;
                 $ausdruck =~ s/Ü/&Uuml;/g;
                 $ausdruck =~ s/ß/&szlig;/g;
                 if ($liste =~ /$ausdruck/) { $text =  "<b>$begriff</b> ist in den unten aufgeführten Dateien gefunden worden:";
                 } else { $text = "<b>$begriff konnte leider nirgends gefunden werden.</b>";}
                 if (!($string =~ /$ausdruck/i)) { $include{$name} = 'nein';
                 } else {
                    $include{$name} = 'ja';
                    $link =  "<a href="$baseurl/$name">$name</a>\n";
                    push(@links, $link);
                 }
                 if ($string =~ /<title>(.*)</title>/i) { $namen{$name} = "$1";
                 } else { $namen{$name} = "";
                 }}} else {
              $text = "<b>Sie haben versäumt, einen Suchbegriff einzugeben.<br />Bitte wiederholen Sie Ihre Anfrage.</b>";
        }}
        foreach $key (keys %include) {
           if ($include{$key} eq 'ja') {
              $titel = "<li>$namen{$key}</li>\n";
              push(@titel, $titel);
        }}

        print $cgi->header().$cgi->start_html(-title =>'Verzeichnis durchsuchen', -style =>{'src'=>$css})."\n";
        print <<ENDE;
        <table border="0" cellspacing="5" cellpadding="8" width="100%"><tr>
        <td colspan="2">$text</td>
        </tr><tr>
        <td>@links</td><td><br /><ul>@titel</ul></td>
        </tr></table>
        ENDE
        print $cgi->end_html();

        exit;

        Grüße aus Berlin

        Christoph S.

        1. Hallo Christoph!

          Danke für deine Antwort und herzlichen Dank für das Script.

          Werde beide Scripte vergleichen und laufen lassen. Habe seit Jahren nichts mehr mit Perl gemacht, weil ich auf PHP umgestiegen bin (einfach einfacher). Trotzdem werde ich mich in beide Scripte einarbeiten.

          Nochmals vielen Dank für deine Antworten und vor allem für deine Mühe und das Script.

          Viele Grüße

          Roland

          1. Hallo an alle.

            Herzlichen Dank nochmal für Eure Ratschläge.

            Aus purer Neugierde habe ich das alte Script noch mal auf dem Server gespielt, und siehe da: Es funzt plötzlich.

            Unerklärlich!!??

            Nochmals vielen Dank für die Ratschläge

            Viele Grüße aus Wollaberg

            Roland

            1. Hi,

              Aus purer Neugierde habe ich das alte Script noch mal auf dem Server gespielt, und siehe da: Es funzt plötzlich.

              Vermutung: erstes Mal im bin-Mode, zweites Mal im ASCII-Mode per ftp übertragen...

              cu,
              Andreas

              --
              Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
              http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/
  2. Hi,

    "Premature end of script headers"

    D.h. es kommt nicht mal zur Ausgabe des content-type-headers - also muß der Fehler noch weiter vorn liegen.

    #!/bin/perl -w
    print "Content-type:text/html\n\n";

    Da steht nur eine Zeile vorher, also muß die Schuld sein:

    #!/bin/perl -w

    Überprüfe, wo auf dem neuen Webspace der perl-Interpreter liegt.
    In vielen Fällen ist das
    /usr/bin/perl

    cu,
    Andreas

    --
    Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
    http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/
    1. hallo Andreas,

      "Premature end of script headers"
      D.h. es kommt nicht mal zur Ausgabe des content-type-headers - also muß der Fehler noch weiter vorn liegen.

      Nicht zwingend. Ich habe eben, um das mal zu provozieren, in einem normalerweise gut funktionierenden kleinen PERL-Script ungefähr in der Mitte eine Zeile auskommentiert. Folge: im (Server-)log bekomme ich dieselbe Meldung "premature end of script headers"  -  allerdings steht zwei Zeilen tiefer auch: "syntax error at /cgi-bin/suche.pl line 63"  -  womit ich weiß, in welcher Scriptzeile der Fehler steckt.
      Davon hat "ibkaler" nichts geschrieben, ob es eine solche Angabe der fehlerhaften Zeile zusätzlich gegeben hat.

      Daß die Meldung "premature end of script headers" ohne zusätzliche Angaben zum Ort des Fehlers erscheint, ist selten. Wenn der Pfad in der "shebang" nicht stimmt, erhalte ich eine Meldung, die (je nach System) "couldn't spawn child process" oder "couldn't find file ..." lautet. Trotzdem:

      Überprüfe, wo auf dem neuen Webspace der perl-Interpreter liegt.
      In vielen Fällen ist das /usr/bin/perl

      Na klar, überprüfen sollte er das natürlich auch.

      Grüße aus Berlin

      Christoph S.

    2. Hallo.

      Vielen Dank für deine Antwort.

      Die Shebang-Zeile stimmt.
      Der Fehler tritt erst auf, wenn das Script keine Übereinstimmmung findet.

      MfG

      Roland

    3. Moin!

      Das, was Du als Fehlermeldung ablieferst leitet praktisch jede Fehlermeldung von Perl ein, so es als CGI verwendet wird.

      Nimm mal die Zeile aus dem Skript, die die Fehlermeldung zum Browser umleitet *), provoziere den Fehler und poste dann hier:

      a) die vollständige Fehlermeldung aus dem error.log
      b) einen Link, von dem wir das getestete perl-skript herunterladen können. (wegen der Fehlermeldungen-> Zeilennummer)

      * use CGI::Carp(fatalsToBrowser);
      -> use CGI;

      MFFG (Mit freundlich- friedfertigem Grinsen)

      fastix®

      --
      Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.