SSI-Aufruf (unable to include...)
Claus
- perl
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
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
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.cgiDer 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.
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
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
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
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
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