Frank Schönmann: Server Side Includes: Problem mit #exec

hi!

Ich rufe in der HTML-Datei test.shtml ein Perl-Skript auf, und zwar via folgender Zeile:
<!--#exec cgi="/cgi-bin/count.pl?file=/http-data/top/www-root/test/test.shtml&expr=<li>"-->

Das Skript soll die Vorkommen des Ausdruckes <expr> in der Datei <file> zählen und als einfachen Text zurückliefern. Aber das ist nicht das Problem, sondern dass der Aufruf des CGI-Skripts anscheinend nicht funktioniert. Als HTML-Ausgabe erscheint folgende Zeile:
[an error occurred while processing this directive]

Und das Logfile meint folgendes dazu:
invalid CGI ref /cgi-bin/count.pl?file=/http-data/top/www-root/test/test.shtml&expr=<li> in /http-data/top/www-root//test/test.shtml

Zweite Frage: Wie muss das CGI-Skript den String denn genau ausgeben? Reicht dann ein einfaches "print $i;", oder muss ein "Content-Type" mit angegeben werden und welcher?

bye, Frank!

  1. hi!

    Ich rufe in der HTML-Datei test.shtml ein Perl-Skript auf, und zwar via folgender Zeile:
    <!--#exec cgi="/cgi-bin/count.pl?file=/http-data/top/www-root/test/test.shtml&expr=<li>"-->

    Das Skript soll die Vorkommen des Ausdruckes <expr> in der Datei <file> zählen und als einfachen Text zurückliefern. Aber das ist nicht das Problem, sondern dass der Aufruf des CGI-Skripts anscheinend nicht funktioniert. Als HTML-Ausgabe erscheint folgende Zeile:
    [an error occurred while processing this directive]
    <!--#exec cgi="/cgi-bin/count.pl?file=/http-data/top/www-root/test/test.shtml&expr=<li>"-->

    Und das Logfile meint folgendes dazu:
    invalid CGI ref /cgi-bin/count.pl?file=/http-data/top/www-root/test/test.shtml&expr=<li> in /http-data/top/www-root//test/test.shtml

    Zweite Frage: Wie muss das CGI-Skript den String denn genau ausgeben? Reicht dann ein einfaches "print $i;", oder muss ein "Content-Type" mit angegeben werden und welcher?

    bye, Frank!

    hallo frank!

    mit SSI's gibts je nach web server jede menge probleme.. probier zuerst vielleicht mal, den
    allerersten slash wegzulassen, also:
    <!--#exec cgi="cgi-bin/count.pl?file=/http-data/top/www-root/test/test.shtml&expr=<li>"-->
    meist liegt das problem an einer falschen konfiguration des web servers. ich hatte aber schon
    probleme sowohl mit dem fast track als auch mit appache. beim omni httpd klappts ohne größere einstellungen. oft hilft auch das einbinden mit <--#include file="/cgi-bin/count.pl...."-->
    man beachte hier wieder den aller ersten slash. (normalerweise sollte dieser tag das file auflisten, aber ich hatte schon einen web server, bei dem man es so einbinden musste).
    vergiss bitte auch nicht, daß du viele sonderzeichen bei der parameterübergabe kodieren musst
    (näheres findest du in selfhtml)

    zu frage 2:
    du musst auf jeden fall den standart html Content Type ausgeben (auch bei SSI's):
    print "Content-type: text/html\n\n";

    viele grüße, alex

    1. hi!

      Danke erstmal für deine Antwort :-)

      mit SSI's gibts je nach web server jede menge probleme.. probier zuerst vielleicht mal, den
      allerersten slash wegzulassen, also:
      <!--#exec cgi="cgi-bin/count.pl?file=/http-data/top/www-root/test/test.shtml&expr=<li>"-->

      Aber sucht er dann nicht das Skript im Unterverzeichnis "cgi-bin" des aktuellen Verzeichnisses?

      meist liegt das problem an einer falschen konfiguration des web servers.

      Glaube ich kaum, denn auf dem gleichen Server laufen schon Perl-Skripts als SSI richtig.

      oft hilft auch das einbinden mit <--#include file="/cgi-bin/count.pl...."-->

      Werde ich auch mal versuchen. Aber ist das nicht eher für Textdateien gedacht als für die Ausgabe von Perl-Skripts?

      zu frage 2:
      du musst auf jeden fall den standart html Content Type ausgeben (auch bei SSI's):
      print "Content-type: text/html\n\n";

      Nochmal danke.

      bye, Frank!

    2. du musst auf jeden fall den standart html Content Type ausgeben (auch bei SSI's):
      print "Content-type: text/html\n\n";

      Da bin ich mir nicht so sicher...
      In der Regel muß
      print "Content-type: text/html\n\n";
      nur bei CGI-Aufrufen über einen Link (Button, HREF) und Onload-Anweisung angegeben werden. Geschieht dies bei SSI's, dann gibt der Browser gewöhnlich genau diesen Text aus! Daher mußt Du es einfach mal ausproieren zu welche Ergebnisse diese Befehlszeile führt.

      Ich hatte bei meinen ersten Perl-Scripten meistens daß Problem, daß der Pfad (in dem Dateien abgelegt wurden) nicht richtig war.
      Aus diesem Grund empfehle ich Dir folgendes Script:

      open(DATEI, ">test.dat") || die print "Fehler beim Schreiben...";
      close (DATEI);

      print "Content-type: text/html\n\n";    #Weglassen bei SSI
      print "<A HREF="test.htm">Hier klicken...</A>";

      Anhand der Fehlermeldungen (bzw. der Datei 'test.dat' sollte es möglich sein, den Standard-Pfad der CGI-Programme und der HTML-Dateien herauszufinden.

      Gruß Felix