Ralf: html mit CGI aufrufen

Hallo,

ich komme einfach nicht darauf. Möchte bei Aufruf einer cgi Datei, dass automatisch eine html Datei gestartet bzw geöffnet wird.

Folgendes:

chdir($home/pfad);

sub dopage {

$type = lc($_[0]);
local($prevpage, $nextpage);
if($type eq "login") {
open(page, "<test/login/login.html");
print "Content-type: text/html\n\n";
} elsif($type eq "loginfail") {
open(page, "<test/login/fail.html");
print "Content-type: text/html\n\n";
} elsif($type eq "index") {
open(page, "<test/index/index.html");
print "Content-type: text/html\n\n";
}

close(page);
return;
}

Die cgi sieht so aus:

#!/usr/bin/perl

require "config.pl";

dopage("index"); (oder irgendeine html Seite)

Wenn ich die cgi starte, bekomme ich nur ein weisses Fenster, aber keine html Seite geladen.

Wer kann mir weiter helfen?

Danke

  1. Hallo!

    Du hast nirgends etwas ausgegeben, deshalb kannst Du auch nichts sehen. Versuchs mal so:

    sub dopage {

    $type = lc($_[0]);
    local($prevpage, $nextpage);
    if($type eq "login") {
    open(PAGE, "<test/login/login.html");
    } elsif($type eq "loginfail") {
    open(PAGE, "<test/login/fail.html");
    } elsif($type eq "index") {
    open(PAGE, "<test/index/index.html");
    }
    print "Content-type: text/html\n\n";
    read PAGE, my $page, -s PAGE or die "Kann Datei nicht lesen: $!";
    close(page);
    print $page;
    return;
    }

    Gruss Markus

    1. Hallo!

      Du hast nirgends etwas ausgegeben, deshalb kannst Du auch nichts sehen. Versuchs mal so:

      sub dopage {

      $type = lc($_[0]);
      local($prevpage, $nextpage);
      if($type eq "login") {
      open(PAGE, "<test/login/login.html");
      } elsif($type eq "loginfail") {
      open(PAGE, "<test/login/fail.html");
      } elsif($type eq "index") {
      open(PAGE, "<test/index/index.html");
      }
      print "Content-type: text/html\n\n";
      read PAGE, my $page, -s PAGE or die "Kann Datei nicht lesen: $!";
      close(page);
      print $page;
      return;
      }

      Gruss Markus

      Hallo Marcus

      das hatte ich auch schon, es bleibt aber auch weiss

      Ralf

      1. Hallo!

        das hatte ich auch schon, es bleibt aber auch weiss

        Wenn alles weiss bleibt, heißt das, daß der Header zwar gesendet wurde, aber ansonsten nichts weiter. Eine Möglichkeit wäre, daß $file weder login, noch loginfail oder index enthält und damit wird auch keine Datei eingelesen. Poste doch mal das Skript etwas ausführlicher, vielleicht kann man dann den Fehler finden.

        Gruss Markus

        1. Hallo!

          das hatte ich auch schon, es bleibt aber auch weiss

          Wenn alles weiss bleibt, heißt das, daß der Header zwar gesendet wurde, aber ansonsten nichts weiter. Eine Möglichkeit wäre, daß $file weder login, noch loginfail oder index enthält und damit wird auch keine Datei eingelesen. Poste doch mal das Skript etwas ausführlicher, vielleicht kann man dann den Fehler finden.

          Gruss Markus

          OK.

          Hier die Index.cgi

          #!/usr/bin/perl

          require "loadup.pl";

          dopage("index");

          die loadup.pl

          $dir = "/home/der/www/pfad/zu/htdocs";

          require "$dir/cgi-bin/config";
          require "$dir/cgi-bin/test/other/routines.pl";
          1;

          die config

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

          1;

          die routines.pl

          chdir($home/pfad);

          sub dopage {

          $type = lc($_[0]);
          local($prevpage, $nextpage);
          if($type eq "login") {
          open(page, "<test/login/login.html");
          print "Content-type: text/html\n\n";
          } elsif($type eq "loginfail") {
          open(page, "<test/login/fail.html");
          print "Content-type: text/html\n\n";
          } elsif($type eq "index") {
          open(page, "<test/index/index.html");
          print "Content-type: text/html\n\n";
          }

          close(page);
          return;
          }

          1. Sorry Marcus, habe mit meinem Nickname (Distl) gepostet

          2. Hallo!

            die loadup.pl
            die config
            die routines.pl

            Auf die schnelle fallen mir die fehlenden ';' auf.

            Mit #!/usr/bin/perl -w erhälst Du Warnungen. Welche? Ggf. im Server-Error.log nachsehen.
            Tut mir leid, aber ich muss gerade weg, melde mich später am Abend nochmal.

            Gruss Markus

          3. Hallo,

            die routines.pl

            chdir($home/pfad);

            1.) $home ist nirgendwo gesetzt.
            2.) chdir($home/pfad); ergibt bei mir (perl 5.6 'Illegal division by zero')
            besser ist
              chdir("$home/pfad");
            wobei wie gesagt $home nicht definiert wurde (wahrscheinlich sollte es $dir heißen).
            und bei pfad vermute ich auch es sollte eigentlich $pfad heißen, muß es aber nicht.

            ich persönlich mag auch ein 'chdir' nicht so wirklich, ich vermeide es wo es nur geht, weil dadurch recht schnell der Ausgangspunkt, d.h eine definierte Umgebung verloren geht.

            sub dopage {[...]

            was mir hier abgeht ist eine Fehlerbehandlung:
            sub dopage
            {
            my $type = lc($_[0]);
            my $filename;
            my $docdir = "$dir/pfad"; #statt chdir und $dir statt $home
            local(*IN);
            if($type eq 'login')
              {
              $filename = "$docdir/test/login/login.html";
              }
            elsif ($type eq 'loginfail')
              {
              $filename = "$docdir/test/login/fail.html";
              }
            elsif ($type eq 'index')
              {
              $filename = "$docdir/test/index/index.html";
              }
            else # falls $type irgendeinen blödsinn beinhaltet
              {
              $filename = "$docdir/test/invalid_type.html"; # oder was auch immer
              }
            print "Content-type: text/html\n\n";
            if(open(IN,$filename))
              {
              print while <IN>; #datei ausgeben
              close(IN);
              }
            else # falls das öffnen der Datei nicht geklappt hat
              {
              print <<EOF
            hier eine schöne HTML-gestylte Fehlermeldung mit vielen DHTML Elementen und einem Flash, daß irgendwas überhaupt nicht stimmt;-)
            EOF
            ;
              }
            return;
            }

            BTW: Die Formatierung des Quellcodes ist zwar Geschmacksfrage, aber etwas Struktur täte Deinem Code sicherlich nicht schlecht.
            Perl kann zwar auch mit weitgehend unformatiertem Quellcode etwas anfangen, die Programmiererin allerding schon deutlich weniger. MIr passiert es immer wieder, daß ich, bevor ich ein Programm ändere, erst mal den Code so formatieren muß, damit ich halbwegs dessen Struktur verstehen kann.
            Bei der Entstehung von Code mag man ja noch wissen, was gemeint ist, zwei Wochen später (und zig Zeilen Code weiter) sieht das ganze anders aus. Aber das nur am Rande.

            Grüße

            Klaus

            1. Hallo Klaus,

              vielen Dank für die Berichtigung, es funktioniert. Sorry für die Unordnung, aber ich fange gerade erst mit CGI an.

              Gruß und Danke
              Ralf

              1. Hallo,

                [...] Sorry für die Unordnung, aber ich fange gerade erst mit CGI an.

                Dann ist jetzt die beste Zeit, damit anzufangen, sich einen guten Stil anzueignen.
                Lies mal 'perldoc perlstyle' der beigepackten Dokumentation durch. Da sind einige gute Anhaltspunkte drin.

                Je eher Du Dir einen gut leserlicher Stil aneignest, desto leichter wirds für Dich und andere, die eventuell mit Deinem Code zu tun haben.
                Schlechte Angewohnheiten wird man ja bekanntlich wieder nur schwer los;-)

                Viel Spaß noch mit Perl (und den hats Du sicher)
                Klaus

      2. Hi,

        open(PAGE, "<test/login/login.html");

        wie wäre es denn mit etwas defensiverer Programmierung und Fehlerbehandlung?
        Bei einem open() kann beispielsweise verteufelt viel schief gehen ...

        Viele Grüße
              Michael