Claus: SSI-Aufruf (unable to include...)

Hi,

ich finde keine Lösung meines Problems.
Hoffe auf einen Hinweis, wo das Problem liegt:

Auf einer Seite im htdocs-Verzeichnis Pfad: test/sub/cygwin.shtml
Habe ich folgenden SSI-Aufruf:
<!--#include virtual="/cgi-bin/ucounter/ucount.cgi?name=ok&counter=text" -->

Funktioniert wunderbar, wenn man die Seite, von einer anderen Web-Seite aufruft (link).
Gibt man allerdings diese Web-Seite direkt im Browser ein, also:
   http://DOMÄNE/test/sub/cygwin.shtml
so erhält man (Mozilla/Netscape4) ein:
  [an error occurred while processing this directive]

Allerdings nicht beim IE6, da gehts wiederrum.

In den ERROR-Logs vom Apache finde ich 2 Einträge:

[Mon May 19 18:14:17 2003] [error] [client 131.188.79.72] malformed header from script. Bad header=<HTML><BODY>Nicht erlaubt auf : f:/apache/1_3_27/apache/cgi-bin/ucounter/ucount.cgi

und

[Mon May 19 18:14:17 2003] [error] [client 131.188.79.72] unable to include "/cgi-bin/ucounter/ucount.cgi?name=ok&counter=text" in parsed file f:/apache/1_3_27/apache/htdocs/test/sub/cygwin.shtml

In der httpd.conf ist wie folgt eingetragen:

<Directory "F:/Apache/1_3_27/Apache/htdocs/test">
   Options Indexes FollowSymLinks Includes ExecCGI
   AddType text/html .shtml
   AddHandler server-parsed .shtml
</Directory>

Anmerkung:
Das CGI-Teil ist in Perl geschrieben. Es handelt sich um ein Counter-Programm. Hoffe das ist auch die richtige Kategorie.

Gruss und Danke
Claus

  1. Halihallo Claus

    ich finde keine Lösung meines Problems.
    Hoffe auf einen Hinweis, wo das Problem liegt:
    [Mon May 19 18:14:17 2003] [error] [client 131.188.79.72] malformed header from script. Bad header=<HTML><BODY>Nicht erlaubt auf : f:/apache/1_3_27/apache/cgi-bin/ucounter/ucount.cgi

    Der Log-Auszug sagt doch alles: malformed header.
    Da scheint was falsch gegangen zu sein... Was muss ein Script im CGI/HTTP-Kontext als
    erstes ausgeben, bevor Nutzdaten kommen?

    Viele Grüsse

    Philipp

    --
    RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
    Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
    1. Halihallo Claus

      ich finde keine Lösung meines Problems.
      Hoffe auf einen Hinweis, wo das Problem liegt:
      [Mon May 19 18:14:17 2003] [error] [client 131.188.79.72] malformed header from script. Bad header=<HTML><BODY>Nicht erlaubt auf : f:/apache/1_3_27/apache/cgi-bin/ucounter/ucount.cgi

      Der Log-Auszug sagt doch alles: malformed header.
      Da scheint was falsch gegangen zu sein... Was muss ein Script im CGI/HTTP-Kontext als
      erstes ausgeben, bevor Nutzdaten kommen?

      Viele Grüsse

      Philipp

      Hab's jetzt rausbekommen. Problem liegt bei der SUB, welche auf illegalen Zugriff überprüft. Die stammt aus einem O'Reilly-Buch
      und hat da wohl zugeschlagen.
      Beim dortigen print "<HTML><BODY>..." fehlt wohl das
      print "Content-type: text/html\n\n";
      Muss ich noch testen, aber das ist es wohl in der Richtung.

      Umgebungsvariable HTTP_REFERER wird genutzt, um festzustellen,

      woher die Anfragen kommen!

      my $server = quotemeta( $ENV{ HTTP_HOST } || $ENV{ SERVER_NAME });
       unless ( $ENV{ HTTP_REFERER } =~ m|^http?://$server/| ) {
         print "<HTML><BODY>Nicht erlaubt auf den Counter zuzugreifen!</BODY></HTML>";
         exit 0; }

      Nochmal Danke
      Gruss
      Claus

      1. Hi Claus,

        Hab's jetzt rausbekommen. Problem liegt bei der SUB, welche auf illegalen Zugriff überprüft. Die stammt aus einem O'Reilly-Buch
        und hat da wohl zugeschlagen.
        Beim dortigen print "<HTML><BODY>..." fehlt wohl das
        print "Content-type: text/html\n\n";

        das ist auch nicht der Job dieser Funktion.

        Dein Hauptprogramm sollte diese Header in jedem Falle schon ganz am Anfang ausgeben, _damit_ das aktuelle Problem eben gerade nicht auftreten kann.
        Diese Prüf-Funktion muß sich darauf verlassen können, daß sie HTML-Code ausgeben darf - ändere daher nicht diese Funktion, sondern das Hauptprogramm.

        unless ( $ENV{ HTTP_REFERER } =~ m|^http?://$server/| ) {
           print "<HTML><BODY>Nicht erlaubt auf den Counter zuzugreifen!</BODY></HTML>";
           exit 0; }

        Diese Abhängigkeit vom HTTP_REFERER erklärt, wieso der Fehler bei der direkten Eingabe in der URL-Zeile auftritt und bei der Einbindung via SSI nicht.
        Würdest Du das Senden des Referers in Deinem Browser abschalten, dann würde der Fehler _immer_ auftreten - es ist gefährlich, sich auf das Vorhandensein des Referers zu verlassen ...

        Viele Grüße
              Michael

        --
        T'Pol: I apologize if I acted inappropriately.
        V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
        (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
         => http://www.peter.in-berlin.de/projekte/selfcode/?code=sh%3A|+fo%3A}+ch%3A]+rl%3A(+br%3A^+n4%3A(+ie%3A%25+mo%3A)+va%3A|+de%3A%2F+zu%3A|+fl%3A(+ss%3A)+ls%3A~+js%3A|
        Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.
        1. Hallo Michael,

          Diese Abhängigkeit vom HTTP_REFERER erklärt, wieso der Fehler bei

          der direkten Eingabe in der URL-Zeile auftritt und bei der Einbindung via SSI nicht.

          Würdest Du das Senden des Referers in Deinem Browser abschalten, dann würde der Fehler _immer_ auftreten - es ist gefährlich, sich auf das Vorhandensein des Referers zu verlassen ...

          Stimmt, bei der direkten Eingabe in der URL-Zeile ist der
          HTTP_REFERER leer. Ich ändere das Haupt-Programm.
          Das Script ist eine Mischung aus Link-Counter(redirect),
          Web- und DownloadCounter(Anzeige der Hits), sodas ich an
          verschiedenen Stellen einen Header ausgebe.
          Aber ich lerne ja noch :-)

          Gruss und TausendDank!
          Claus

          Viele Grüße
                Michael

          1. Hi Claus,

            Das Script ist eine Mischung aus Link-Counter(redirect),
            Web- und DownloadCounter(Anzeige der Hits), sodas ich an
            verschiedenen Stellen einen Header ausgebe.

            Und die Verwendung des Referers dient ausschließlich dazu, daß Du nicht an jeder Aufrufstelle einen zusätzlichen Query-String-Parameter mit der Adresse der aufrufenden Seite daran hängen mußt (so würdest Du dieselbe Information nämlich zuverlässig erhalten) - es ist also reine Bequemlichkeit bei der Referenzierung und sonst nichts. _Dafür_ opfert das Skript die Betriebssicherheit des Zählers ...

            Viele Grüße
                  Michael

            --
            T'Pol: I apologize if I acted inappropriately.
            V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
            (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
             => http://www.peter.in-berlin.de/projekte/selfcode/?code=sh%3A|+fo%3A}+ch%3A]+rl%3A(+br%3A^+n4%3A(+ie%3A%25+mo%3A)+va%3A|+de%3A%2F+zu%3A|+fl%3A(+ss%3A)+ls%3A~+js%3A|
            Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.
  2. Hi Claus,

    Hoffe auf einen Hinweis, wo das Problem liegt:
    Funktioniert wunderbar, wenn man die Seite, von einer anderen Web-Seite aufruft (link).
    Gibt man allerdings diese Web-Seite direkt im Browser ein, also:
       http://DOMÄNE/test/sub/cygwin.shtml
    so erhält man (Mozilla/Netscape4) ein:
      [an error occurred while processing this directive]
    Allerdings nicht beim IE6, da gehts wiederrum.

    wenn das tatsächlich zutreffen sollte, dann schließe ich daraus, daß Dein CGI-Skript vermutlich folgende Eigenschaften hat:

    1. Es arbeitet bedingt auf den HTTP-Header "User-Agent" (denn nur dann kann ich mir einen Unterschied im Verhalten verschiedener Browser vorstellen - den ích allerdings ohnehin bezweifele).

    2. Es arbeitet bedingt auf den HTTP-Header "Referer" - dieser ist nämlich bei direkter Eingabe undefiniert, bei SSI-Einbindung aber (hochwahrscheinlich) definiert.

    3. Es gibt _nicht_ zu Beginn seiner Verarbeitung die erforderlichen HTTP-Header aus. Dies kann möglicherweise vom Anwendungszweck bedingt sein (vielleicht weiß es erst während der Verarbeitung, welche Header es ausgeben muß - ich selbst habe solche Skripte) - wahrscheinlicher ist aber, daß dies eine ungünstige Programmstruktur verursacht hat. Jedenfalls gibt es mindestens einen Kontrollflußweg innerhalb dieses Skriptes, wo die Ausgabe der HTTP-Header vergessen wurde und statt dessen sofort HTML-Code ausgegeben wird - und das ist verkehrt (unabhängig vom verwendeten Browser, übrigens).

    In den ERROR-Logs vom Apache finde ich 2 Einträge:
    [Mon May 19 18:14:17 2003] [error] [client 131.188.79.72] malformed header from script. Bad header=<HTML><BODY>Nicht erlaubt auf : f:/apache/1_3_27/apache/cgi-bin/ucounter/ucount.cgi

    Eben - hier fehlt der HTTP-Header.

    [Mon May 19 18:14:17 2003] [error] [client 131.188.79.72] unable to include "/cgi-bin/ucounter/ucount.cgi?name=ok&counter=text" in parsed file f:/apache/1_3_27/apache/htdocs/test/sub/cygwin.shtml

    Das halte ich für einen Folgefehler des vorherigen.

    In der httpd.conf ist wie folgt eingetragen:

    Die ist an Deinem Problem nicht beteiligt - ebensowenig wie (wahrscheinlich) der verwendete Browser.

    Das CGI-Teil ist in Perl geschrieben. Es handelt sich um ein Counter-Programm.

    Versuche, dieses Programm zu verstehen, zu debuggen und in den oben genannten Aspekten ggf. umzuschreiben.

    Viele Grüße
          Michael

    --
    T'Pol: I apologize if I acted inappropriately.
    V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
    (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
     => http://www.peter.in-berlin.de/projekte/selfcode/?code=sh%3A|+fo%3A}+ch%3A]+rl%3A(+br%3A^+n4%3A(+ie%3A%25+mo%3A)+va%3A|+de%3A%2F+zu%3A|+fl%3A(+ss%3A)+ls%3A~+js%3A|
    Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.