andreas: zu doof für "hallo welt"???????

Hi!

Irgendwie vrezweifele ich! Ich hatte erst gedacht, damit auszukommen, einfach fertige Skripte umzuschreiben, was auch funzt,, d.h. ich hab schon zig cgi bzw. perl Skripte auf meinem Server laufen, aber für meine speziellen Bedürfnisse wollte ich dann doch mal perl von Grunde auf lernen. Jetzt probiere ich das "Hallo Welt" Skript laufen zu lassen, aber das will nicht funktionieren.
Also hier mal das Script, welches ich im editor unter hallo.pl gespeichert, hochgeladen, auf 755 gesetzt habe, und dann die genaue Adresse in den Browser eingegeben, aber es kommt immer "internal server error":

#!/usr/bin/perl
print "Hallo Welt\n";

Folgendes Skript läuft ohne Probleme:(Dateiname diag.cgi)

#!/usr/bin/perl
print "Content-type: text/html\n\n";
foreach $item (keys %ENV)
{ print "$item = $ENV{$item}<BR> \n"; }
$rundir=pwd;
print "Working Directory is: $rundir<BR>";

Was kann das bitte sein? Diverse formmail Skripte laufen auch, was könnte das sein?
Gruß
Andreas

  1. Hallo Andreas

    Irgendwie vrezweifele ich! Ich hatte erst gedacht, damit auszukommen, einfach fertige Skripte umzuschreiben, was auch funzt,, d.h. ich hab schon zig cgi bzw. perl Skripte auf meinem Server laufen, aber für meine speziellen Bedürfnisse wollte ich dann doch mal perl von Grunde auf lernen. Jetzt probiere ich das "Hallo Welt" Skript laufen zu lassen, aber das will nicht funktionieren.

    #!/usr/bin/perl
    print "Hallo Welt\n";

    das ist auch etwas mager, Du must schon mitgeben, was Du da ausgibst.
    Also etwa HTML (oder sonstwas)

    print "Content-type: text/html\n\n";
    und dann erst
    print "<html><body>Hallo Welt\n</body></html>";

    Viele Grüße Günter

  2. Hallo andreas,

    #!/usr/bin/perl
    print "Hallo Welt\n";

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

    Ich hoffe Du siehst den Unterschied zwischen den beiden Skripten nun deutlicher ;-)
    Wenn Du andere Deiner angepassten Skripte untersuchst, wirst Du sicherlich irgendwo immer über 'print "Content-Type:....";', 'print header;' oder 'print $q->header;' (oder so ähnlich) stolpern.
    Der Apache erwartet vom ausgeführten CGI-Skript die Rückgabe eines Content-Type-Headers (gibt den Mime-Type der Rückgabe), damit der Browser weis wie er die Daten anzuzeigen (oder was auch immer damit zu tun) hat. Diesen kann der Apache nicht erraten, den Status bzw. Datum und weitere mögliche HTTP-Header schon (obwohl er deren Werte afaik ja nicht rät ;-).
    Also füge vor Deine Ausgabe den Header aus dem zweiten Skript ein, und alles wird gut (natürlich nur, wenn Du HTML ausgibst. Bei anderen Daten ist der Content-Type bzw. Mime-Type wieder anders).

    Gruß AlexBausW

    P.S.: Wenn Du schon anfängst eigene Skripte zu schreiben, solltest Du Dir angewöhnen, diese immer mit:

    #!/usr/bin/perl -w
    use strict;

    zu beginnen. Daneben lohnt sich eine Beschäftigung mit CGI.pm, dessen Dokumentation Du mit 'perldoc CGI' einsehen kannst.

    1. Hi nochmal,

      [...]

      Der Apache [...] der Apache

      [...]

      Ich dachte ich hätte irgendwo gelesen, daß der verwendete Server ein Apache ist, mich aber wohl getäuscht :-) Aber das gesagte gilt afaik allgemein für die CGI-Schnittstelle, egal mit welchem Server, daß heist ein CGI-Programm _muss_ mindestens einen Content-Type-Header zurückgeben. Der Apache ist z.B. so freundlich, weitere Header zu ergänzen ;-)

      Im übrigen steht imho meistens im Errorlog der Grund für den 500er-Fehler. Also immer zuerst dort nachschlagen. Dann kannst Du die meisten Fehler schon selbst beheben.

      Gruß AlexBausW

      1. Hi Alex!

        Ich dachte ich hätte irgendwo gelesen, daß der verwendete Server ein Apache ist, mich aber wohl getäuscht :-) Aber das gesagte gilt afaik allgemein für die CGI-Schnittstelle, egal mit welchem Server, daß heist ein CGI-Programm _muss_ mindestens einen Content-Type-Header zurückgeben.

        Nicht ganz, es gibt auch Webserver, die raten sogar diesen Header (meist text/html natuerlich).

        Allgemein empfiehlt sich bei solchen CGI-Script-will-nicht-Geschichten immer http://www.teamone.de/selfaktuell/artikel/schroepl03.htm, welches auch eine kleine Checkliste enthaelt.

        So long

      2. Hi Alex
        Ist ein apache, aber leider bei Strato, da komme ich an die errorlog... nicht ran.
        Danke für die Tips, hat sofort gefunzt

        *schäm*

        Aber ich kann nicht kpl. html code so übernehmen, oder? Also ich hatte das probiert, so mit <h1>... das geht, aber wenn ich anfange mit <center>, font.... dann ists vorbei!
        Weißt Du zufällig, wo ich was darüber lesen kann?
        Gruß
        Alex

        1. Hallo!

          Aber ich kann nicht kpl. html code so übernehmen, oder?

          Du kannst alles ausgeben, was Du auch in eine html-Datei schreiben würdest, also Tags, Javascript ...
          Das Einzige, das Du beachten musst, ist die Anführungszeichen zu maskieren, also z.B.:
          print "<a href="blabla.htm">";

          Also ich hatte das probiert, so mit <h1>... das geht, aber wenn ich anfange mit <center>, font.... dann ists vorbei!

          Sollte eigentlich gehen, poste doch mal den Problemteil.

          Weißt Du zufällig, wo ich was darüber lesen kann?

          http://www.perldoc.com

          Gruss Markus

          1. Hallo!
            Also hier das Script, kann halt was per html form eingeben und bekomme dann ein 2. Form zurück, nur dass in den hidden fields mit den Variablen keine Wert steht, sondern immer noch die Variable selbst, als Text!

            #!/usr/bin/perl

            use CGI qw(param);

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

            print <<EOF ;

            <head><title>CGI Results</title></head>

            <form name="form1" method="post" action="/cgi-bin/mailto.cgi">
             <input type="hidden" name="Produkt" value="'.param("Produkt").'">
             <input type="hidden" name="Preis" value="'.param("Preis").'">
              <font color="#FF0000" face="Arial, Helvetica, sans-serif" size="4">Bestellformular</font>
              <p> Name:
                <input type="text" name="Name">
                Vorname:
                <input type="text" name="Vorname">
              </p>
              <p>
                <input type="submit" name="Abschicken" value="weiter">
                <input type="reset" name="Abschicken2" value="Zurücksetzen">
              </p>
            </form>
            <p> </p>
            <h1 align="center"> </h1>

            EOF

            exit ;

            Gruß
            Alex

            1. Hallo Alex (oder Andreas)!

              Ändere Dein Script so ab:

              #!/usr/bin/perl

              use CGI qw(param);

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

              $produkt = param("Produkt");
              $preis = param("Preis");

              print <<EOF ;

              <head><title>CGI Results</title></head>

              <form name="form1" method="post" action="/cgi-bin/mailto.cgi">
               <input type="hidden" name="Produkt" value="$produkt">
               <input type="hidden" name="Preis" value="$preis">
                <font color="#FF0000" face="Arial, Helvetica, sans-serif" size="4">Bestellformular</font>
                <p> Name:
                  <input type="text" name="Name">
                  Vorname:
                  <input type="text" name="Vorname">
                </p>
                <p>
                  <input type="submit" name="Abschicken" value="weiter">
                  <input type="reset" name="Abschicken2" value="Zurücksetzen">
                </p>
              </form>
              <p> </p>
              <h1 align="center"> </h1>
              EOF

              exit ;

              ------------------------------------

              -> value="'.param("Produkt").'">

              Das ist in diesem Kontext falsch. Der Operator . dient dazu, Zeichenketten zu verknüpfen. Du muss ihn also benutzen, wenn du eine print-Anweisung hast, da Du dort den Textstring mit der Variablen verknüpfst.
              Also: print 'Einiges an Text'.$variable.'noch mehr Text';
              Statt ' kannst du auch " verwenden, aber dann am Anfang und Ende gleich.

              Wenn Du jedoch print <<EOF verwendest, kannst Du dort die Variablen direkt verwenden, s.o. .

              Gruss

              Markus

              1. Hi Markus!
                Funzt wunderbar!!!Danke!!!!
                Genau so hatte ich es mir vorgestellt, alles andere klappt jetzt auch:-)
                Bin nur noch etwas am grübeln, ob es eine einfache Möglichkeit gibt, diese gesammelten daten verschlüsselt zu versenden, wenigstens sowas wie Kreditkartennummern usw.
                SSL Verschlüsselung wäre da wohl am besten, nur hab ich keinen Server, auf dem das (bezahlbar) läuft.
                Kennst Du evtl noch eine einfache Möglichkeit, so Daten anders zu verschlüsseln?
                Nochmal vielen Dank für Deine Hilfe, hat mir seeeeehr viel gebracht! Komme langsam mit dem perl code auch besser zu Recht

                Gruß
                Alex