Calocybe: Java Script und SSI

Beitrag lesen

Hi Daniel!

Ich muss Dir leider sagen, Du hast da was ganz grundlegendes nicht verstanden. SSI wird serverseitig ausgefuehrt. Der Webserver durchsucht die zu sendende Datei nach Stellen, die ungefaehr so aussehen:
<!-- #include file="include.file.inc" -->
und ersetzt diesen Teil durch den Inhalt der Datei, die in Anfuehrungszeichen steht. Wusstest Du sicher, aber noch mal die Betonung: Das passiert beim Webserver, BEVOR der irgendetwas zum Browser schickt.

Der Browser bekommt nun eine Datei gesendet, in der der obige Pseudo-Kommentar eben durch den entsprechenden Dateiinhalt ersetzt wurde. Das heisst vor allem, dass der Browser ueberhaupt nicht feststellen kann, dass da irgendwann mal eine SSI-Ersetzung stattgefunden hat. Er interpretiert einfach das, was er da bekommt.

Wenn Du jetzt wie hier

document.write("<!--#include virtual="stories\ticker.txt"-->");
document.write("<!--#include virtual="'stories\ticker.txt"-->");
document.write("<!--#include virtual=/"stories\ticker.txt/"-->");

versuchst, mit einem JavaScript solche Kommentare in Deine Datei zu schreiben, und wir nehmen mal an, der Webserver haette das vorher noch nicht angemeckert, dann wuerden diese eben in Deinem HTML-Code stehen. Aber dort sind sie eben nichts anderes mehr als simple HTML-Kommentare. Es gibt da niemanden mehr, der eine SSI-Ersetzung durchfuehren koennte, denn das Ausfuehren der SSI ist ja schon laengst vorbei. Das hat vorhin stattgefunden, als die Datei noch auf dem Webserver lag. Aber jetzt ist sie ja schon beim Browser angekommen, nachdem sie einen weiten Weg ueber Netzwerkkabel, Telefonleitungen, Satellitenverbindungen oder auch Laserstrecken genommen hat.

Mit anderen Worten: Was Du da machen willst, geht so in der Form ueberhaupt nicht.

Aber naja, diese Fehlermeldung:

In der Ausgabe kommt dann immer
[SSI Syntax Error or Command Prohibited]

wird ja erzeugt, wenn die Datei noch lange nicht beim Browser ist. Der Webserver kommt naemlich mit Deiner SSI-Syntax nicht zurecht. Bei diesen beiden Versuchen:

document.write("<!--#include virtual="'stories\ticker.txt"-->");
document.write("<!--#include virtual=/"stories\ticker.txt/"-->");

ist das auch klar. Der Webserver interessiert sich naemlich ueberhaupt nicht dafuer, dass da document.write oder sonstwas steht, er sieht nur das:
<!--#include virtual="'stories\ticker.txt"-->
Und das ist eben keine ordentliche SSI-Syntax, weil nach dem = ein \ steht.

Aber bei

document.write("<!--#include virtual="stories\ticker.txt"-->");

ist die Syntax diesbezueglich erstmal in Ordnung. Was ist nun hier falsch? Da fallen mir verschiedene Dinge ein. Zuerstmal ist die Form #include virtual nur fuer virtuelle Verzeichnisse gedacht. Wenn also ueberhaupt, muesste es so heissen
<!-- #include virtual="/stories/ticker.txt" -->
Virtuelle Verzeichnisse werden mit / getrennt (oder hast Du schonmal in einer URL einen \ angegeben?), und sie sollten dem Webserver natuerlich auch als solche gemeldet sein. Fuer relative Referenzierungen verwendet man die file-Form
<!-- #include file="stories/ticker.txt" -->  oder auch  <!-- #include file=".\stories\ticker.txt" --> wenn Dein Dateisystem die \ unterstuetzt (also von MS ist). Kann aber sein, dass Dein Webserver das nicht so eng sieht, fuer den Apache zum Beispiel ist das in Ordnung.
Weiterhin kann ein Leerzeichen zwischen <!-- und #  und vor dem --> nicht schaden.

Wie kommt das ? Wenn ich den gleichen SSI-Tag ohne document.write nehme, dann funktioniert es und der Fehler kommt nicht.

Mmh, das wundert mich dann schon etwas. Vielleicht verlangt Dein Webserver, dass der SSI-Kommentar allein auf einer Zeile steht? Wenn Du das ohne document.write() machst, setzt Du dann den Kommentar auch ausserhalb der JS-Sektion? Koennte naemlich sein, dass das doppelte Kommentar-Oeffnen (erstes mal beim <SCRIPT>, zweites mal das SSI) irgendwie Probleme macht.

Wie kann ich denn SSI mit JavaScript aufrufen ? Ich brauch das nämlich unbedingt.

Wie gesagt, ueberhaupt nicht. Vielleicht solltest Du sowas machen:

In der Datei include.txt:
<SCRIPT ...><!--
    var text_to_write = "Hier der ganze lange Text, der ausgegeben werden soll";
--></SCRIPT>

Dann in der Hauptdatei:
<!-- #include file="include.txt" -->
<SCRIPT ...><!--
    document.write(text_to_write);
--></SCRIPT>

HTH, Calocybe