<?xml version="1.0"?>
<!DOCTYPE modulesynopsis SYSTEM "../style/modulesynopsis.dtd">
<?xml-stylesheet type="text/xsl" href="../style/manual.de.xsl"?>
<modulesynopsis metafile="mod_include.xml.meta">

<name>mod_include</name>
<description>Vom Server vor der Auslieferung interpretierte
Dokumente (Server Side Includes)</description>
<status>Base</status>
<sourcefile>mod_include.c</sourcefile>
<identifier>include_module</identifier>
<compatibility>Seit der Apache-Version 2.0 als Ausgabefilter 
implementiert</compatibility>

<summary>
    <p>Dieses Module stellt einen Filter zur Verf&uuml;gung, der Dateien vor der
    Auslieferung an den Client verarbeitet. Diese Verarbeitung wird von speziell
    formatierten SGML-Kommentaren gesteuert, die als
    <dfn>Elemente</dfn> bezeichnet werden. Diese Elemente k&ouml;nnen die
    Einbindung weiterer Dateien und Programme
    sowie das Setzen und Ausgeben
    von Umgebungsvariablen betreffen.</p>
</summary>
<seealso><directive module="core">Options</directive></seealso>
<seealso><directive module="core">AcceptPathInfo</directive></seealso>
<seealso><a href="../filter.html">Filter</a></seealso>
<seealso><a href="../howto/ssi.html">SSI-Tutorial</a></seealso>

<section id="enabling">
    <title>Server-Side Includes aktivieren</title>

    <p>Server Side Includes (SSIs) werden mit dem 
    <code>INCLUDES</code>-<a href="../filter.html">Filter</a>
    implementiert. Erhalten Dokumente mit SSI-Direktiven die
    Dateinamenserweiterung <code>.shtml</code>, veranlassen folgende
    Anweisungen den Apache, diese Dokumente zu untersuchen
    und dem Ergebnis den MIME-Typ <code>text/html</code> zuzuweisen:</p>

    <example>
      AddType text/html .shtml<br />
      AddOutputFilter INCLUDES .shtml
    </example>

    <p>Die folgende Anweisung muss f&uuml;r alle Verzeichnisse mit
    <code>.shtml</code>-Dateien gegeben werden (normalerweise in einem
    <directive module="core" type="section">Directory</directive>-Abschnitt,
    die Anweisung kann aber auch in <code>.htaccess</code>-Dateien stehen,
    wenn
    <directive module="core">AllowOverride</directive> <code>Options</code>
    gesetzt wurde):</p>

    <example>
      Options +Includes
    </example>

    <p>Um die Kompatibilit&auml;t f&uuml;r &auml;ltere Versionen zu 
gew&auml;hrleisten,
    aktiviert der <code>server-parsed</code>
    -<a href="../handler.html">Handler</a> auch den 
    <code>INCLUDE</code>-Filter. Au&szlig;erdem aktiviert der Apache
    diesen Filter f&uuml;r jedes Dokument mit dem MIME-Typ
    <code>text/x-server-parsed-html</code> oder
    <code>text/x-server-parsed-html3</code> (wobei die Ausgabe
    den Typ <code>text/html</code> erh&auml;lt).</p>

    <p>Weitere Informationen finden Sie im <a
    href="../howto/ssi.html">SSI-Tutorial</a>.</p>
</section> <!-- /enabling -->

<section id="pathinfo">
    <title>SSI und PATH_INFO</title>

    <p>F&uuml;r SSI verarbeitete Dateien akzeptieren standardm&auml;&szlig;ig
    keine Anfragen mit
    <code>PATH_INFO</code> (nachgestellte Pfadinformationen)
    mehr.  Mit der <directive
    module="core">AcceptPathInfo</directive>-Anweisung kann der
    Server so konfiguriert werden, dass er Anfragen mit
    <code>PATH_INFO</code> akzeptiert.</p>
</section> <!-- /pathinfo -->

<section id="elements"><title>Grundelemente</title>
    <p>Das Dokument wird als HTML-Dokument mit speziellen als
    SGML-Kommentare eingebetteten Befehlen analysiert. Ein Befehl
    hat folgende Syntax: </p>

    <example>
      &lt;!--#<var>Element</var> <var>Attribut</var>=<var>Wert</var>
      <var>Attribut</var>=<var>Wert</var> ... --&gt;
    </example>

    <p>Der Wert wird h&auml;ufig in doppelte Anf&uuml;hrungszeichen gesetzt. 
Einfache
    Anf&uuml;hrungszeichen (<code>'</code>) oder H&auml;kchen 
    (<code>`</code>) k&ouml;nnen ebenfalls benutzt werden.
    Bei vielen Befehlen ist lediglich ein einziges Attribut-/Wertpaar 
zul&auml;ssig.
    Beachten Sie, dass vor dem Abschlusszeichen eines Kommentars
    (<code>--&gt;</code>) ein Leerzeichen stehen sollte, damit es nicht als
    Bestandteil eines SSI-Elements gewertet wird. Die folgende Tabelle 
f&uuml;hrt
    die m&ouml;glichen Elemente auf:</p>

    <table border="1">
    <tr><th>Element</th><th>Beschreibung</th></tr>
    <tr><td><code><a href="#element.config">config</a></code></td>
        <td>Konfiguration der Ausgabeformate</td></tr>
    <tr><td><code><a href="#element.echo">echo</a></code></td>
        <td>Ausgabe von Variablen</td></tr>
    <tr><td><code><a href="#element.exec">exec</a></code></td>
        <td>Ausf&uuml;hrung externer Programme</td></tr>
    <tr><td><code><a href="#element.fsize">fsize</a></code></td>
        <td>Ausgabe der Gr&ouml;&szlig;e einer Datei</td></tr>
    <tr><td><code><a href="#element.flastmod">flastmod</a></code></td>
        <td>Ausgabe des Datums der letzten &Auml;nderung einer Datei</td></tr>
    <tr><td><code><a href="#element.include">include</a></code></td>
        <td>Einbinden von Dateien</td></tr>
    <tr><td><code><a href="#element.printenv">printenv</a></code></td>
        <td>Ausgabe aller verf&uuml;gbaren Variablen</td></tr>
    <tr><td><code><a href="#element.set">set</a></code></td>
        <td>Den Wert einer Variablen setzen</td></tr>
    </table>

    <p>SSI-Elemente k&ouml;nnen von anderen Modulen als
    <module>mod_include</module> definiert werden. Das
    <code><a href="#element.exec">exec</a></code>-Element geh&ouml;rt
    beispielsweise zu <module>mod_cgi</module> und steht nur zur
    Verf&uuml;gung, wenn dieses Modul geladen ist.</p>

    <section id="element.config"><title>Das config-Element</title>
      <p>Dieser Befefehl steuert unterschiedliche Aspekte bei der
      Auswertung eines Dokuments. Zul&auml;ssige Attribute sind:</p>

      <dl>
      <dt><code>echomsg</code> (<em>Ab Apache 2.1</em>)</dt>
      <dd>Eine Nachricht, die an den Client zur&uuml;ckgesendet wird, wenn das
      <code><a href="#element.echo">echo</a></code>-Element
      versucht, eine nicht definierte Variable zur&uuml;ckzuliefern.
      Diese Einstellung hat Vorrang vor
      <directive module="mod_include">SSIUndefinedEcho</directive>.</dd>

      <dt><code>errmsg</code></dt>
      <dd>Eine Nachricht, die an den Client zur&uuml;ckgesendet wird,
      wenn bei der Untersuchung eines Dokuments Fehler auftreten.
      Alle <directive module="mod_include">SSIErrorMsg</directive>-
      Anweisungen werden &uuml;berschrieben.</dd>

      <dt><code>sizefmt</code></dt>
      <dd>Das Format f&uuml;r die Anzeige der Dateigr&ouml;&szlig;e. 
Zul&auml;ssige Werte
      sind <code>bytes</code> f&uuml;r die Angabe in Byte oder
      <code>abbrev</code> f&uuml;r die Anzeige in kByte oder MByte
      nach Gutd&uuml;nken des Moduls.
      Eine Gr&ouml;&szlig;e von 1.024 Byte wird beispielsweise als "1K" 
ausgegeben.</dd>

      <dt><code>timefmt</code></dt>
      <dd>Eine Zeichenfolge, die von der Bibliotheksroutine
<code>strftime</code> f&uuml;r die Ausgabe von Datumsangaben verwendet 
wird.</dd>
      </dl>
    </section> <!-- /config -->

    <section id="element.echo"><title>Das echo-Element</title>
      <p>Dieser Befehl f&uuml;hrt zur Ausgabe einer der unten aufgef&uuml;hrten
      <a href="#includevars">include-Variablen</a>. Wurde die
      Variable nicht gesetzt, dann legt die 
      <directive module="mod_include">SSIUndefinedEcho</directive>-
      Anweisung die Ausgabe fest. Das Ausgabeformat von
      Datumsangaben h&auml;ngt von <code>timefmt</code> ab.</p>

      <p>Attribute:</p> 

      <dl>
      <dt><code>var</code></dt>
      <dd>Anzugeben ist der Name der auszugebenden Variablen.</dd>

      <dt><code>encoding</code></dt>
      <dd><p>Die Kodierung von Sonderzeichen innerhalb der
      Variablen vor der Ausgabe. Bei der Angabe von <code>none</code>
      wird keine Kodierung vorgenommen. Bei der Angabe von
      <code>url</code> wird die URL-Kodierung benutzt (auch bekannt als 
%-Kodierung,
      die f&uuml;r URLs in Links usw. gedacht ist). Zu Beginn eines
      <code>echo</code>-Elements ist die Voreinstellung
      <code>entity</code> f&uuml;r die Entit&auml;tskodierung f&uuml;r 
HTML-Elemente
      auf Blockebene (Textabs&auml;tze). Diese Voreinstellung kann mit dem
      Attribut <code>encoding</code> ge&auml;ndert werden, welches bis zum
      n&auml;chsten <code>encoding</code>-Attribut oder bis zum Ende
      des Elements g&uuml;ltig bleibt.</p>

      <p>Dem <code>var</code>-Attribut muss das entsprechende
      <code>encoding</code>-Attribut <em>vorangehen</em>. 
       Es werden nur Sonderzeichen nach der ISO-8859-1-Kodierung
       verschl&uuml;sselt. Wird eine andere Zeichenkodierung verwendet,
       wird m&ouml;glicherweise nicht das gew&uuml;nschte Ergebnis erreicht.</p>

      <note type="warning">
        Um Probleme zwischen unterschiedlichen Sites zu vermeiden,
        sollten von einem Benutzer &uuml;bermittelte Daten
        <em>immer</em> kodiert werden.
      </note>
      </dd>
      </dl>
    </section> <!-- /echo -->

    <section id="element.exec"><title>Das exec-Element</title>
      <p>Der <code>exec</code>-Befehl f&uuml;hrt den angebenen Shell-Befehl
      oder das angegebene CGI-Skript aus. Daf&uuml;r muss das
      <module>mod_cgi</module>-Modul geladen sein. Wurde
      <directive module="core">Options</directive>
      <code>IncludesNOEXEC</code> gesetzt, ist dieser Befehl vollst&auml;ndig
      deaktiviert. Die zul&auml;ssigen Attribute sind:</p>

      <dl>
      <dt><code>cgi</code></dt>
      <dd><p>Ein (%-kodierter) URL-Pfad zum CGI-Skript. Beginnt der
      Pfad nicht mit einem Slash (/), wird er relativ zum aktuellen Dokument
      interpretiert. Das Dokument, auf das mit diesem Pfad verwiesen wird,
      wird als CGI-Skript aufgerufen, auch wenn der Server es normalerweise
      nicht als solches erkennen w&uuml;rde. Das Verzeichnis, in welchem sich
      das Skript befindet, muss jedoch f&uuml;r CGI-Skripte freigeschaltet sein
      (mit <directive module="mod_alias">ScriptAlias</directive>
      oder <directive module="core">Options</directive>
      <code>ExecCGI</code>).</p>

      <p>Dem CGI-Skript werden Pfadinformationen und der
      <code>QUERY_STRING</code> der
      urspr&uuml;nglichen Client-Anfrage &uuml;bergeben. Diese Angaben 
k&ouml;nnen
      <em>nicht</em> &uuml;ber den URL-Pfad erfolgen. Neben der
      standardm&auml;&szlig;igen <a href="mod_cgi.html">CGI</a>-Umgebung
      stehen dem Skript die Include-Variablen zur Verf&uuml;gung.</p>

      <example><title>Beispiel</title>
        &lt;!--#exec cgi="/cgi-bin/example.cgi" --&gt;
      </example>

      <p>Liefert das Skript anstelle einer Ausgabe einen
      <code>Location:</code>-Header zur&uuml;ck, dann wird dieser in einen
      HTML-Anker umgewandelt.</p>

      <p>Das <code><a href="#includevirtual">include virtual</a></code>-
      Element sollte dem <code>exec cgi</code>-Element gegen&uuml;ber vorgezogen
      werden. Insbesondere dann, wenn zus&auml;tzliche Argument mit der
      Anfragezeichenfolge an ein CGI-Programm &uuml;bergeben werden m&uuml;ssen,
      kann dies nicht mit <code>exec cgi</code> geschehen, sondern kann
      wie folgt mit <code>include virtual</code> geschehen:</p>

      <example>
        &lt;!--#include virtual="/cgi-bin/example.cgi?argument=value" --&gt;
      </example>
      </dd>

      <dt><code>cmd</code></dt>
      <dd><p>Der Server f&uuml;hrt die &uuml;bergebene Zeichenfolge aus und 
benutzt hierbei
      <code>/bin/sh</code>. Die <a href="#includevars">Include-Variablen</a>
      stehen dem Befehl neben den &uuml;blichen CGI-Variablen zur 
Verf&uuml;gung.</p>

      <p>In fast allen F&auml;llen ist <code><a href="#includevirtual"
      >#include virtual</a></code> den Anweisungen
      <code>#exec cgi</code> oder <code>#exec cmd</code> gegen&uuml;ber
      vorzuziehen. <code>#include virtual</code> verwendet den
      standardm&auml;&szlig;igen Apache-Mechanismus f&uuml;r die Einbindung von 
Dateien
      oder Skripten. Die Anweisung ist viel erprobter und auf aktuellerem 
Stand.</p>

      <p>Au&szlig;erdem k&ouml;nnen bei Betriebssystemen wie Win32
      (und Unix bei Verwendung von <a href="../suexec.html">suexec</a>)
      keine Argumente an einen Befehl in einer <code>exec</code>-Anweisung
      &uuml;bergeben oder Leerstellen in den Befehl eingef&uuml;gt werden. 
Folgende
      Anweisung funktioniert beispielsweise ohne <code>suexec</code>
      unter Unix, f&uuml;hrt aber unter Win32 oder bei Ausf&uuml;hrung von
      <code>suexec</code> nicht zum gew&uuml;nschten Ergebnis:</p>

      <example>
        &lt;!--#exec cmd="perl /path/to/perlscript arg1 arg2" --&gt;
      </example>
      </dd>
      </dl>
    </section> <!-- /exec -->

    <section id="element.fsize"><title>Das fsize-Element</title>
      <p>Dieser Befehl gibt die Gr&ouml;&szlig;e der angegebenen Datei aus, 
unter
Verwendung der durch <code>sizefmt</code> festgelegten Formatangabe.
M&ouml;gliche Attribute sind:</p>

      <dl>
      <dt><code>file</code></dt>
      <dd>Ein zum Verzeichnis des untersuchten Dokuments relativer
      Pfad.</dd>

      <dt><code>virtual</code></dt>
      <dd>Ein %-kodierter URL-Pfad. Beginnt er nicht mit einem Slash (/),
      wird er relativ zum aktuellen Dokument interpretiert. Beachten Sie, dass
      <em>nicht</em> der Umfang einer CGI-Ausgabe ausgegeben wird,
      sondern die Gr&ouml;&szlig;e des CGI-Skripts selbst.</dd>
      </dl>
    </section> <!-- /fsize -->

    <section id="element.flastmod"><title>Das flastmod-Element</title>
      <p>Dieser Befehl gibt das Datum der letzten &Auml;nderung der angegebenen
      Datei aus,  unter Verwendung der durch <code>timefmt</code> festgelegten
      Formatangabe. Die Attribute sind die gleichen wie beim
      <code><a href="#element.fsize">fsize</a></code>-Befehl.</p>
    </section> <!-- /flastmod -->

    <section id="element.include"><title>Das include-Element</title>
      <p>Dieser Befehl f&uuml;gt den Text eines anderen Dokuments oder einer
      anderen Datei in die bearbeitete Datei ein. Alle eingef&uuml;gten Dateien
      unterliegen der &uuml;blichen Zugriffskontrolle. Wurde f&uuml;r das 
Verzeichnis
      der bearbeiteten Datei <a href="core.html#options">Options</a>
      <code>IncludesNOEXEC</code> gesetzt, werden nur Dokumente
      mit den MIME-Typen  der Klasse <code>text/plain</code>,
      <code>text/html</code>
      usw. eingebunden. Andernfalls werden CGI-Skripte wie gew&ouml;hnlich
      mit der dem Befehl &uuml;bergebenen URL (einschlie&szlig;lich 
Anfragezeichenfolge)
      aufgerufen.</p>

      <p>Das Attribut gibt die Position des Dokuments an. Die Einbindung
      erfolgt f&uuml;r jedes der <code>include</code>-Anweisung &uuml;bergebene 
Attribut.
      Zul&auml;ssige Attribute sind:</p>

      <dl>
      <dt><code>file</code></dt>
      <dd>Ein zum Verzeichnis des gerade bearbeiteten Dokuments
      relativer Pfad. Er darf weder die Schreibweise <code>../</code>
      enthalten, noch darf  es ein absoluter Pfad sein. Somit k&ouml;nnen keine
      Dateien eingebunden werden, die au&szlig;erhalb des Dokumentverzeichnisses
      oder oberhalb des aktuellen Dokuments in der Verzeichnisstruktur liegen.
      Das Attribut <code>virtual</code> sollte diesem
      Attribut gegen&uuml;ber immer vorgezogen werden.</dd>

      <dt><code><a id="includevirtual" name="includevirtual"
      >virtual</a></code></dt>
      <dd><p>Ein %-kodierter URL-Pfad. Die URL darf kein
      Schema oder einen Host-Namen enthalten, lediglich ein Pfad oder
      ein optionaler Query-String sind zul&auml;ssig. Steht kein
      Slash (/) am Anfang, wird der Pfad relativ zum aktuellen Dokument
      interpretiert.</p>

      <p>Eine URL wird aus dem Attribut gebildet und die Ausgabe,
      die der Server zur&uuml;ckliefern w&uuml;rde, wenn der Client auf die URL
      zugreifen w&uuml;rde, wird in die bearbeitete Ausgabe eingebunden. Auf 
diese Weise
      k&ouml;nnen eingebundene Dateien geschachtelt werden.</p>

      <p>Handelt es sich bei der angegebenen URL um ein CGI-Programm,
      wird dieses Programm ausgef&uuml;hrt und dessen Ausgabe anstelle
      der Anweisung in die bearbeitete Datei eingef&uuml;gt. Eine CGI-URL
      darf einen Query-String enthalten:</p>
     
      <example>
        &lt;!--#include virtual="/cgi-bin/example.cgi?argument=value" --&gt;
      </example>
           
      <p><code>include virtual</code> sollte f&uuml;r die Einbindung von
      Ausgaben von CGI-Programmen in einem HTML-Dokument
      gegen&uuml;ber <code>exec cgi</code> vorgezogen werden.</p>
      </dd>
      </dl>
    </section> <!-- /include -->

    <section id="element.printenv"><title>Das printenv-Element</title>
      <p>Gibt eine Liste aller vorhandenen Variablen und ihrer Werte aus.
      Sonderzeichen werden vor der Ausgabe
      nach der Entit&auml;tskodierung verschl&uuml;sselt
      (Einzelheiten hierzu finden Sie beim
      <code><a href="#element.echo">echo</a></code>-Element).
      Diese Anweisung &uuml;bernimmt interpetiert keine Attributwerte.</p>

      <example><title>Beispiel</title>
        &lt;!--#printenv --&gt;
      </example>
    </section> <!-- /printenv -->

    <section id="element.set"><title>Das set-Element</title>
      <p>Hiermit wird der Wert einer Variablen gesetzt. Die
      Attribute sind:</p>

      <dl>
      <dt><code>var</code></dt>
      <dd>Der Name der zu setzenden Variablen.</dd>

      <dt><code>value</code></dt>
      <dd>Der dieser Variable zuzuweisende Wert.</dd>
      </dl>

      <example><title>Beispiel</title>
        &lt;!--#set var="category" value="help" --&gt;
      </example>
    </section> <!-- /set -->
</section> <!-- /basic elements -->

<section id="includevars">
    <title>Include-Variablen</title>

    <p>Zus&auml;tzlich zu den standardm&auml;&szlig;igen Variablen der 
CGI-Umgebung
    stehen diese Include-Variablen f&uuml;r den <code>echo</code>-Befehl, die
    <code>if</code>- und die <code>elif</code>-Anweisung sowie
    f&uuml;r jedes &uuml;ber das Dokument aufgerufene Programm zur 
Verf&uuml;gung.</p>

    <dl>
      <dt><code>DATE_GMT</code></dt>
      <dd>Das aktuelle Datum nach GMT.</dd>

      <dt><code>DATE_LOCAL</code></dt>
      <dd>Das aktuelle Datum der lokalen Zeitzone.</dd>

      <dt><code>DOCUMENT_NAME</code></dt>
      <dd>Der Dateiname (ohne Verzeichnisangabe) des vom
      Benutzer angeforderten Dokuments.</dd>

      <dt><code>DOCUMENT_URI</code></dt>
      <dd>Die %-kodierte URL des vom Benutzer angeforderten
      Dokuments. Bei verschachtelten Include-Dateien ist dies
      <em>nicht</em> die URL des aktuellen Dokuments.</dd>

      <dt><code>LAST_MODIFIED</code></dt>
      <dd>Das Datum der letzten &Auml;nderung des vom Benutzer
      angeforderten Dokuments.</dd>

      <dt><code>QUERY_STRING_UNESCAPED</code></dt>
      <dd>Ist ein Query-String vorhanden, enth&auml;lt diese Variable den
      die %-dekodierten Query-String, die f&uuml;r eine Verwendung innerhalb
      einer (UNIX-)Shell geeignet 'escaped' wurde.</dd>
    </dl>
</section>

<section id="substitution"><title>Variablensubstitution</title>

    <p>Variablensubstitution bei Zeichenfolgen in Anf&uuml;hrungszeichen
    erfolgt meist dann, wenn diese sinnvollerweise als Argument einer
    SSI-Direktive auftreten k&ouml;nnen. Hierzu geh&ouml;ren die
    Anweisungen<code>config</code>,
    <code>exec</code>, <code>flastmod</code>, <code>fsize</code>,
    <code>include</code>, <code>echo</code> und <code>set</code>
    sowie die Argumente f&uuml;r Bedingungsoperatoren.
    Durch Voranstellung eines Backslash kann ein Dollarzeichen in 
    eine Zeichenfolge eingef&uuml;gt werden:</p>

    <example>
      &lt;!--#if expr="$a = \$test" --&gt;
    </example>
    <p>Muss ein Variablenverweis in der Mitte einer Zeichenfolge
    ersetzt werden, die selbst als g&uuml;ltiger Bezeichner gelten kann, wird
    die Mehrdeutigkeit durch geschweifte Klammern aufgehoben, genau wie
    das bei der Ersetzung innerhalb einer (UNIX-)Shell der Fall w&auml;re:</p>

    <example>
      &lt;!--#set var="Zed" value="${REMOTE_HOST}_${REQUEST_METHOD}" --&gt;
    </example>

    <p>Die Variable <code>Zed</code> wird
    "<code>X_Y</code>" gesetzt, wenn <code>REMOTE_HOST</code> den Wert
    "<code>X</code>" und <code>REQUEST_METHOD</code> den Wert 
    "<code>Y</code>" enth&auml;lt.</p>

    <p>Im folgenden Beispiel wird "in foo" ausgegeben, wenn
    <code>DOCUMENT_URI</code> gleich <code>/foo/file.html</code> ist
    und "in bar", wenn es gleich <code>/bar/file.html</code> ist, andernfalls
    wird in keinem von beiden ausgegeben:</p>

    <example>
      &lt;!--#if expr='"$DOCUMENT_URI" = "/foo/file.html"' --&gt;<br />
      <indent>
        in foo<br />
      </indent>
      &lt;!--#elif expr='"$DOCUMENT_URI" = "/bar/file.html"' --&gt;<br />
      <indent>
        in bar<br />
      </indent>
      &lt;!--#else --&gt;<br />
      <indent>
        in neither<br />
      </indent>
      &lt;!--#endif --&gt;
    </example>
</section>

<section id="flowctrl">
    <title>Elemente zur Flusskontrolle</title>

    <p>Die wichtigsten Elemente zur Flusskontrolle sind:</p>

    <example>
      &lt;!--#if expr="<var>Testbedingung</var>" --&gt;<br />
      &lt;!--#elif expr="<var>Testbedingung</var>" --&gt;<br />
      &lt;!--#else --&gt;<br />
      &lt;!--#endif --&gt;
    </example>

    <p>Das <code>if</code>-Element funktioniert wie die <code>if</code>-
    Anweisung einer Programmiersprache. Die Testbedingung wird ausgewertet und
    wenn das Ergebnis wahr ist, dann wird der Text bis zum n&auml;chsten 
<code>elif</code>-,
    <code>else</code>- oder <code>endif</code>-Element in den Ausgabestrom
    eingebaut.</p>

    <p>Mit der <code>elif</code>- oder <code>else</code>-Anweisung
    wird Text in den Ausgabestrom eingebunden, wenn die urspr&uuml;ngliche
    <var>Testbedingung</var> nicht erf&uuml;llt ist. Diese Elemente sind 
optional.</p>

    <p>Das <code>endif</code>-Element schlie&szlig;t das <code>if</code>-
    Element ab und ist erforderlich.</p>

    <p>Die <var>Testbedingung</var> kann folgenderma&szlig;en 
    aussehen:</p>

    <dl>
      <dt><code><var>String</var></code></dt>
      <dd>Die Bedingung ist erf&uuml;llt, wenn <var>String</var> nicht leer 
ist.</dd>

      <dt><code><var>String1</var> = <var>String2</var><br />
      <var>String1</var> == <var>String2</var><br />
      <var>String1</var> != <var>String2</var></code></dt>
      
      <dd><p>Vergleiche <var>String1</var> mit <var>String2</var>. Wenn 
      <var>String2</var> die Form <code>/<var>String2</var>/</code>
      hat, wird er als regul&auml;rer Ausdruck behandelt. Regul&auml;re 
Ausdr&uuml;cke werden
      mit der <a href="http://www.pcre.org";>PCRE</a>-Bibliothek implementiert 
und
      haben die gleiche Syntax wie in <a href="http://www.perl.com";>Perl
      5</a>. Die Schreibweise <code>==</code> entspricht der Schreibweise
      <code>=</code> und hat die gleiche Wirkung.</p>

      <p>Beim positiven Vergleich (<code>=</code> oder
      <code>==</code>) k&ouml;nnen gruppierte Teile des regul&auml;ren Ausdrucks
      erfasst werden. Die erfassten Teile werden in den speziellen
      Variablen <code>$1</code> ..
      <code>$9</code> gespeichert.</p>

      <example><title>Beispiel</title>
        &lt;!--#if expr="$QUERY_STRING = /^sid=([a-zA-Z0-9]+)/" --&gt;<br />
        <indent>
          &lt;!--#set var="session" value="$1" --&gt;<br />
        </indent>
        &lt;!--#endif --&gt;
      </example>
      </dd>

      <dt><code><var>String1</var> &lt; <var>String2</var><br />
       <var>String1</var> &lt;= <var>String2</var><br />
       <var>String1</var> &gt; <var>String2</var><br />
       <var>String1</var> &gt;= <var>String2</var></code></dt>

      <dd>Vergleiche <var>String1</var> mit <var>String2</var>. Die
      Zeichenfolgen werden <em>Zeichen f&uuml;r Zeichen</em>
      miteinander verglichen (mit <code>strcmp(3)</code>). Daher ist die
      Zeichenfolge "100" kleiner als die Zeichenfolge "20".</dd>

      <dt><code>( <var>Testbedingung</var> )</code></dt>
      <dd>Ist erf&uuml;llt, wenn <var>Testbedingung</var> erf&uuml;llt ist.</dd>

      <dt><code>! <var>Testbedingung</var></code></dt>
      <dd>Ist erf&uuml;llt, wenn <var>Testbedingung</var> nicht erf&uuml;llt 
ist.</dd>

      <dt><code><var>Testbedingung1</var> &amp;&amp;
        <var>Testbedingung2</var></code></dt>
      <dd>Ist erf&uuml;llt, wenn <var>Testbedingung1</var> und
      <var>Testbedingung2</var> erf&uuml;llt sind.</dd>

      <dt><code><var>Testbedingung1</var> ||
        <var>Testbedingung2</var></code></dt>
      <dd>Ist erf&uuml;llt, wenn <var>Testbedingung1</var> oder
      <var>Testbedingung2</var> erf&uuml;llt ist.</dd>
    </dl>

    <p>"<code>=</code>" und "<code>!=</code>" binden enger als
    "<code>&amp;&amp;</code>" und "<code>||</code>". "<code>!</code>"
    bindet am st&auml;rksten. Die folgenden Anweisungen sind 
gleichbedeutend:</p>

    <example>
      &lt;!--#if expr="$a = test1 &amp;&amp; $b = test2" --&gt;<br />
      &lt;!--#if expr="($a = test1) &amp;&amp; ($b = test2)" --&gt;
    </example>

    <p>Die Boole'schen Operatoren <code>&amp;&amp;</code> und
    <code>||</code> haben die gleiche Priorit&auml;t. Soll ein solcher Operator
    st&auml;rker gebunden werden, m&uuml;ssen Klammern gesetzt werden.</p>

    <p>Alles, was nicht als Variable oder Operator erkannt wird,
    wird wie eine Zeichenfolge behandelt. Zeichenfolgen k&ouml;nnen auch in
    Anf&uuml;hrungszeichen stehen: <code>'string'</code>. Steht eine
    Zeichenfolge nicht in Anf&uuml;hrungszeichen, dann darf sie keinen
    Whitespace (Leerzeichen oder Tabulatoren) enthalten, weil diese Zeichen die
    Bestandteile von Anweisungen voneinander trennen. Stehen mehrere
    Zeichenfolgen in einer Zeile,  werden Sie mit Leerzeichen verkettet:</p>

    <example>
      <p><code><var>String1</var>&nbsp;&nbsp;&nbsp;&nbsp;<var
      >string2</var></code> ergibt <code><var>String1</var>&nbsp;<var
      >string2</var></code><br />
      <br />
      und<br />
      <br />
      <code>'<var>String1</var>&nbsp;&nbsp;&nbsp;&nbsp;<var
      >string2</var>'</code> ergibt <code><var
      >string1</var>&nbsp;&nbsp;&nbsp;&nbsp;<var>String2</var></code>.</p>
    </example>

    <note><title>Optimierung Boole'scher Ausdr&uuml;cke</title>
      <p>Werden Ausdr&uuml;cke immer komplexer, so dass sie die Verarbeitung
      deutlich bremsen, dann k&ouml;nnen sie entsprechend der Auswertungsregeln
      optimiert werden:</p>
      <ul>
      <li>Ausdr&uuml;cke werden von links nach rechts ausgewertet.</li>
      <li>Bin&auml;re Boole'sche Operatoren (<code>&amp;&amp;</code>
      und <code>||</code>) werden, falls m&ouml;glich, kurz geschlossen. In
      &Uuml;bereinstimmung mit der oben aufgef&uuml;hrten Regel bedeutet das,
      dass <module>mod_include</module> zuerst den linken Ausdruck auswertet.
      Reicht das Ergebnis aus, um das Endergebnis zu bestimmen, wird
      die weitere Verabeitung an dieser Stelle abgebrochen. Trifft das nicht zu,
      wird die rechte Seite ausgewertet und das Endergebnis anhand der 
Ergebnisse
      der linken und der rechten Seite berechnet.</li>
      <li>Solange regul&auml;re Ausdr&uuml;cke behandelt werden m&uuml;ssen, 
wird die
      verk&uuml;rzte Auswertung nicht wirksam. Diese m&uuml;ssen ausgewertet 
werden,
      um die R&uuml;ckverweisvariablen (<code>$1</code> .. <code>$9</code>)
      zuzuweisen.</li>
      </ul>
      <p>Wenn Sie nachvollziehen m&ouml;chten, wie ein bestimmter Ausdruck
      behandelt wird, k&ouml;nnen Sie <module>mod_include</module>
      mit der Compileroption <code>-DDEBUG_INCLUDE</code> noch
      einmal kompilieren. F&uuml;r jeden untersuchten Ausdruck erhalten Sie dann
      Informationen zu den Elementen, der Reihenfolge und das Resultat der
      Auswertung, die mit der Ausgabe an den Client gesendet werden.</p>
    </note>
</section>

<directivesynopsis>
<name>SSIEndTag</name>
<description>Die Zeichenfolge, die ein Include-Element beendet.</description>
<syntax>SSIEndTag <var>Tag</var></syntax>
<default>SSIEndTag &quot;--&gt;&quot;</default>
<contextlist><context>server config</context><context>virtual host</context>
</contextlist>
<compatibility>Verf&uuml;gbar ab Version 2.0.30.</compatibility>

<usage>
    <p>Mit dieser Anweisung wird die Zeichenfolge ge&auml;ndert, die
    <module>mod_include</module> das Ende eines Include-Elements
    signalisiert.</p>

    <example><title>Beispiel</title>
      SSIEndTag "%&gt;"
    </example>

</usage>
<seealso><directive module="mod_include">SSIStartTag</directive></seealso>
</directivesynopsis>

<directivesynopsis>
<name>SSIUndefinedEcho</name>
<description>Die Zeichenfolge, die angezeigt wird, wenn der Inhalt
einer nicht gesetzten Variablen mit der Anweisung 'echo'
ausgegeben werden soll.</description>
<syntax>SSIUndefinedEcho <var>String</var></syntax>
<default>SSIUndefinedEcho &quot;(none)&quot;</default>
<contextlist><context>server config</context><context>virtual host</context>
<context>directory</context><context>.htaccess</context></contextlist>
<override>All</override>
<compatibility>Ab Version 2.0.34</compatibility>

<usage>
    <p>Mit dieser Anweisung wird die Zeichenfolge ge&auml;ndert, die
    <module>mod_include</module> anzeigt, wenn
    der Inhalt einer nicht gesetzten Variable mit 'echo' ausgegeben
werden soll.</p>

    <example><title>Beispiel</title>
      SSIUndefinedEcho "&lt;!-- undef --&gt;"
    </example>
</usage>
</directivesynopsis>

<directivesynopsis>
<name>SSIErrorMsg</name>
<description>Die Fehlermeldung, die bei einem SSI-Fehler angezeigt 
wird.</description>
<syntax>SSIErrorMsg <var>Meldung</var></syntax>
<default>SSIErrorMsg &quot;[an error occurred while processing this
directive]&quot;</default>
<contextlist><context>server config</context><context>virtual host</context>
<context>directory</context><context>.htaccess</context></contextlist>
<override>All</override>
<compatibility>Ab Version 2.0.30</compatibility>

<usage>
    <p>Mit der <directive>SSIErrorMsg</directive>-Direktive wird die
    Fehlermeldung ge&auml;ndert, die angezeigt wird, wenn 
    <module>mod_include</module> auf einen Fehler st&ouml;&szlig;t.
    F&uuml;r den produktiven Einsatz kann die Standardfehlermeldung
    beispielsweise in <code>&quot;&lt;!-- Fehler --&gt;&quot;</code>
    ge&auml;ndert werden, damit die Meldung dem Benutzer nicht angezeigt 
wird.</p>

    <p>Diese Anweisung liefert das gleiche Ergebnis wie
    <code>&lt;!--#config errmsg=<var>Meldung</var> --&gt;</code>-Element.</p>

    <example><title>Beispiel</title>
      SSIErrorMsg "&lt;!-- Error --&gt;"
    </example>
</usage>
</directivesynopsis>

<directivesynopsis>
<name>SSIStartTag</name>
<description>Die Zeichenfolge, mit der ein Include-Element 
beginnt.</description>
<syntax>SSIStartTag <var>Tag</var></syntax>
<default>SSIStartTag &quot;&lt;!--#&quot;</default>
<contextlist><context>server config</context><context>virtual host</context>
</contextlist>
<compatibility>Ab Version 2.0.30</compatibility>

<usage>
    <p>Mit dieser Anweisung wird die Zeichenfolge ge&auml;ndert, an dem
    <module>mod_include</module> ein zu verarbeitendes
    Include-Element erkennt.</p>

    <p>Die M&ouml;glichkeit kann bei zwei Servern genutzt werden, die die 
Ausgabe
    einer Datei untersuchen und jeweils unterschiedliche Befehle verarbeiten
    (m&ouml;glicherweise zu unterschiedlichen Zeiten).</p> 

    <example><title>Beispiel</title>
      SSIStartTag "&lt;%"
    </example>

    <p>In Verbindung mit einem &uuml;bereinstimmenden
    <directive module="mod_include">SSIEndTag</directive> k&ouml;nnen
    SSI-Anweisungen so verwendet werden, wie das in dem
    nachfolgenden Beispiel der Fall ist:</p>

    <example><title>SSI-Anweisungen mit alternativen Start- und End-Tags</title>
      &lt;%printenv %&gt;
    </example>
</usage>
<seealso><directive module="mod_include">SSIEndTag</directive></seealso>
</directivesynopsis>

<directivesynopsis>
<name>SSITimeFormat</name>
<description>Konfiguration des Formats zur Anzeige von 
Datumswerten</description>
<syntax>SSITimeFormat <var>Format-String</var></syntax>
<default>SSITimeFormat &quot;%A, %d-%b-%Y %H:%M:%S %Z&quot;</default>
<contextlist>
<context>server config</context><context>virtual host</context>
<context>directory</context><context>.htaccess</context></contextlist>
<override>All</override>
<compatibility>Ab Version 2.0.30</compatibility>

<usage>
<p>Der Format-String mu&szlig; so angegeben werden,
wie dies f&uuml;r einen Parameterwert der <code>strftime(3)</code>-Funktion der
C-Standardbibliothek der Fall w&auml;re.</p>

    <p>Diese Anweisung liefert das gleiche Ergebnis wie 
    das <code>&lt;!--#config timefmt=<var>formatstring</var> --&gt;</code>-
    Element.</p>

    <example><title>Beispiel</title>
      SSITimeFormat "%R, %B %d, %Y"
    </example>

    <p>Diese Anweisung sorgt daf&uuml;r, dass Zeitangaben im Format
    "22:26, June 14, 2002" erfolgen.</p>
</usage>
</directivesynopsis>

<directivesynopsis>
<name>XBitHack</name>
<description>SSI-Direktiven in Dateien mit gesetztem Execute-Bit werden
ausgewertet.</description>
<syntax>XBitHack on|off|full</syntax>
<default>XBitHack off</default>
<contextlist><context>server config</context><context>virtual host</context>
<context>directory</context><context>.htaccess</context></contextlist>
<override>Options</override>

<usage>
    <p>Mit der <directive>XBitHack</directive>-Anweisung wird die
    Untersuchung gew&ouml;hnlicher HTML-Dokumente gesteuert. Sie
    betrifft ausschlie&szlig;lich Dateien des MIME-Typs <code>text/html</code>.
    Folgende Werte k&ouml;nnen angegeben werden:</p>

    <dl>
      <dt><code>off</code></dt>
      <dd>Keine besondere Behandlung ausf&uuml;hrbarer Dateien.</dd>

      <dt><code>on</code></dt>
      <dd>Alle <code>text/html</code>-Dateien mit gesetztem
      User-Execute-Bit werden als vom Server auszuwertendes
      HTML-Dokument behandelt.</dd>

      <dt><code>full</code></dt>
      <dd>Gleichbedeutend mit <code>on</code>, zus&auml;tzlich wird aber
      noch das Group-Execute-Bit &uuml;berpr&uuml;ft. Ist es gesetzt, wird das
      <code>Last-modified</code>-Datum der zur&uuml;ckgesendeten Datei
      als Datum der letzten &Auml;nderung gesetzt. Ist es nicht gesetzt, wird 
kein Datum
      der letzten &Auml;nderung gesendet. Wenn dieses Bit gesetzt wird, 
k&ouml;nnen
      Clients und Proxies das Ergebnis der Anfrage zwischenspeichern. 

      <note><title>Note</title>
      <p>Die Verwendung der Option <code>full</code> ist nicht ratsam,
      es sei denn, Sie sind
      in der Lage, sicherzustellen, dass das group-execute Bits f&uuml;r alle
      SSI-Skripte, welche CGI-Skripte einbinden oder auf andere Weise
      bei jedem Zugriff wechselnde Ausgaben liefern, nicht gesetzt ist.</p>
      </note>
      </dd>
    </dl>

    </usage>
</directivesynopsis>

</modulesynopsis>


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to