.. -*- coding: utf-8; mode: rst -*-
.. include:: ../apache_setup_refs.txt
.. _xref_static-content:
================================================================================
Static Content (static-content.conf)
================================================================================
Die Site ``static-content.conf`` stellt *statische* Resourcen bereit. Statische
Resourcen sind Dateien oder Ordnerstruturen die über HTTP freigegeben werden
sollen. I.d.R. wird hier der unveränderliche Content abgelegt, den die *Sites*
(nach-) laden. Das sind z.B. die statischen Javascript Bibliotheken für den
Betrieb einer Site oder aber auch Ordnerstrukturen, wie z.B. HTML Dokumente.
.. code-block:: bash
sudo -H a2ensite static-content
Die Installation dieser *Static-Site* wird empfohlen, da auch noch weitere
Setups (z.B. :ref:`xref_site_expimp` oder :ref:`xref_site_webshare`) von diesem
Static Content profitieren. Jedoch wird nicht empfohlen, eine solche
Konfiguration, die SSI (:ref:`xref_server_side_include`) verwendet ohne weiteres
im Internet zu betreiben.
.. _xref_static_content_chrome:
``chrome`` Resource
===================
Die *chrome* Resource hat zur Aufgabe statischen Content, der zur Anzeige von
WEB-Sites wie dem *Autoindex* erforderlich ist, bereit zu stellen. In dem
*chrome* Ordner befinden sich beispielsweise die Icons zu den Dateitypen, die
das Feature ":ref:`xref_autoindex_directories`" in seinen generierten HTML
Dokumenten referenziert. Die Resource definiert sich wie unten stehend.
.. code-block:: apache
Alias /chrome /var/www/chrome
Require all granted
Allow from all
AllowOverride None
Options +Indexes +FollowSymLinks +IncludesNOEXEC
HeaderName /chrome/header.shtml
ReadmeName /chrome/footer.shtml
AddType text/html .shtml
AddHandler server-parsed .shtml
Header always set X-Robots-Tag "none"
Da dieser statische Content nur der *Gestalltung* dient, ist hierfür keine
:ref:`xref_apache-auth` erforderlich, was über die Direktive ``Require all
granted`` gesetzt wird. Es macht auch keinen Sinn, wenn eine Suchmaschine diese
*Gestalltungselemente* indiziert, was mit dem ``X-Robots-Tag "none"``
konfiguriert wird (s.a. :ref:`xref_global_http_headers`). Mittels ``Allow from
all`` wird der Zugriff aus jedem Netz erlaubt. Um den Zugriff einzuschränken
muss das ``all`` der :ref:`xref-allow-directive` durch entsprechende Netzmasken
oder IPs ersetzt werden.
* HeaderName / ReadmeName: :ref:`xref_autoindex_directories` /
:ref:`xref_server_side_include`
* AddType / AddHandler : :ref:`xref_server_side_include`
* Options: :ref:`xref_options_indexes`
.. _xref-allias-directive:
Alias Direktive
===============
Mit der Alias Direktive aus dem `Apache mod_alias`_ Modul kann auf Resourcen
verwiesen werden die nicht im ``DocumentRoot`` Ordner liegen. Die Resource wird
dann unter der entsprechenden URL zur Verfügung gestellt.
.. code-block:: apache
Alias /chrome /var/www/chrome
...
Mit dieser Direktive wird der Content aus dem Ordner ``/var/www/chrome`` unter
der URL https://localhost/chrome referenziert.
.. _xref-allowoverride-directive:
AllowOverride
=============
Mit der `Apache AllowOverride Direktive`_ wird gesetzt, welche Otionen in einer
``.htaccess`` lokal in einem Ordner angepasst werden können. Mit
.. code-block:: apache
AllowOverride None
darf keine Option überschrieben werden. Andere sinnvolle Werte können
z.B. Anpassungen an der Autorisierung und dem Autoindex sein:
.. code-block:: apache
AllowOverride AuthConfig Indexes
Hier im Setup werden lokale Anpassungen in ``.htaccess`` Dateien nicht
erforderlich werden, manche Installation einer WEB-Anwendung ist aber auf
*Overerrides* angewiesen.
.. _xref-allow-directive:
Allow-Direktive
===============
In der Allow-Direktive (`Apache Access Control`_ / `Apache mod_acces_compat`_)
können nicht nur IPs bzw. Netzmasken angeben werden, es ist auch möglich Domian-
oder Host-Namen anzugeben. Es sind aber die Netzmasken den *Host-/Domain-Namen*
vorzuziehen, da die Namensauflösung Zeit und Netztraffic in Anspruch nehmen kann
und es nicht auszuschließen ist, dass der `DNS (wiki)`_ -- *den der Apache
benötigt um die IP Adresse in einem Namen aufzulösen* -- Teil eines
Angriffszenarios ist, oder ob er einfach nur *buggy* ist.
Um eine solche Konfiguration strukturiert durchführen zu können müssen die
Grundlagen der Natzmaskierung bekannt sein, die in der
:ref:`xref_excursion_IPv4_6` vermittelt werden. I.d.R. wird man den Zugriff aus
den folgenden Netzen konfigurieren:
* Netzweit ``all``
* IPv4 localhost: ``127.0.0.0/8``
* IPv4 *privates* Class-A Subnetz ``10.0.0.0/8``
* IPv4 *privates* Class-B Subnetz ``192.168.0.0/16``
* IPv4 *privates* Class-C Subnetz ``192.168.0.0/24``
* IPv6 localhost: ``::1``
* IPv6 Link-Lokal Netz: ``fe80::/10``
* IPv6 Unique-Local Subnetz: ``fd00::/8``
Die ``Allow``, ``Order`` und ``Deny`` Direktiven wurden bereits im
:ref:`xref_deny_from_root` gesetzt, es wurde *alles dicht gemacht*. Um eine Site
*Netzweit* frei zu geben, muss die Allow-Direktive auf ``all`` gesetzt. werden
.. code-block:: apache
Allow from all
Um die Site in dem Link-Lokal Netzt frei zu geben eignet sich:
.. code-block:: apache
Allow from fd00::/8 192.168.0.0/16 fe80::/10 127.0.0.0/8 ::1
Die beiden letzten Beispiele basieren auf den vererbeten ``Order`` und die
``Deny`` Direktieven aus dem :ref:`xref_deny_from_root` Konzept. Die Vererbung
kann oft ein hilfsreiches Gestaltungsmittel sein, bei der Gewährung von
Zugriffsrechten auf eine Site empfiehlt es sich *expliziet* zu sein und auf eine
Vererbung zu verzichten. Man muss dann zwar etwas mehr notieren, aber die
Zugriffkontrolle ist damit zentral an der *Site* angebracht und
unmissverständlich.
.. code-block:: apache
Order deny,allow
Deny from all
Allow from fd00::/8 192.168.0.0/16 fe80::/10 127.0.0.0/8 ::1
.. _xref_autoindex_directories:
Autoindex von Directories
=========================
Zum *Static Content* gehört in diesem Setup noch die Installation des `Apache
mod_autoindex`_ Moduls. Mit diesem Modul wird die Auflistung des Inhalts eines
Ordners (eines *Directory*) in ein HTML Dokument umgewandelt und über HTTP an
den WEB-Browser gegeben. Sozusagen, ein *nur lesender* Dateiexplorer über
HTTP. Mit dem *Autoindex* kann in der Ordnerstruktur einer Resource navigiert
werden. Die :ref:`xref_site_sysdoc` (*sysdoc*) oder der :ref:`xref_site_expimp`
Ordner sind Beispiele für diese Anwendung des *Autoindex*.
Mit dem Autoindex-Modul wird von Debian noch eine Default-Konfiguration
ausgeliefert, die *hier* im Setup jedoch durch eine etwas *verbesserte*
Konfiguration ersetzt wird.
* Default: ``/etc/apache2/mods-available/autoindex.conf``
* Anpassung: ``/etc/apache2/conf-available/autoindex.conf``
.. code-block:: bash
sudo -H mv autoindex.conf autoindex.conf-disabled
sudo -H a2enconf autoindex
sudo -H a2enmod autoindex
In der ``autoindex.conf`` wird das Setup für die Anzeige der Ordnerinhalte
konfiguriert. Hier ein Auszug:
.. code-block:: apache
IndexOptions FancyIndexing XHTML HTMLTable SuppressHTMLPreamble \
VersionSort FoldersFirst DescriptionWidth=* NameWidth=* \
Charset=UTF-8
...
AddIconByType (IMG,/chrome/icons/16x16/mimetypes/gnome-mime-image.png) image/*
AddIconByType (SND,/chrome/icons/16x16/mimetypes/gnome-mime-audio.png) audio/*
AddIconByType (TXT,/chrome/icons/16x16/mimetypes/gnome-mime-text.png) text/*
AddIconByType (VID,/chrome/icons/16x16/mimetypes/gnome-mime-video.png) video/*
...
AddDescription "tar (tape) archive" .tar
AddDescription "GZIP compressed document" .Z .z .gz .zip
AddDescription "ZIP compressed document" .zip
Die `Apache IndexOptions Direktive`_ wird wie die `Apache Options Direktive`_
vererbt (vergleiche :ref:`xref_options_indexes`).
Die ``IndexOptions`` Direktive steht *hier* in einem globalen Kontext, damit
wird sie auf jede (freigegebene) statische Resource *vererbt*. Will eine
Autoindex-Site den ``FancyIndex``-Style nicht eingeschaltet haben, dann muss
diese Autoindex-Site ``IndexOptions -FancyIndex`` definieren. Die ``+/-``
Notation wird am Beispiel :ref:`xref_options_indexes` noch genauer erläutert.
In dem obigen Ausschnitt der Konfiguration ist auch zu sehen, dass für die
Dateitypen (Mimetypes) die passenden Icons konfiguriert werden. Diese Icons
werden in der Ordneransicht des Autoindex dann mit angezeigt. Die Icons werden
in dem -- vom Autoindex generierten -- HTML Dokument als ``img``-Tag
eingebunden:
.. code-block:: html
.. hint::
Der Browser wird das Bild unter der URL ``https://myhostname/chrome/``
nachladen. Hier *schließt sich dann der Kreis* von Autoindex und der
statischen *chrome* Resource.
.. _xref_options_indexes:
Autoindex aktivieren
====================
Mit der Direktive ``Options +Indexes`` wird der *chrome* Ordner im WEB-Browser
auch *navigierbar* (vergleiche :ref:`xref_static_content_chrome`).
.. code-block:: apache
Options +Indexes +IncludesNOEXEC +FollowSymLinks
Die `Apache Options Direktive`_ wird vererbt. Bereits im Root Ordner (vergleiche
:ref:`xref_deny_from_root`) wurden die *default* ``Options`` im *globalen*
Dateisystem-Kontext gesetzt. Diese werden auf alle Ordner (und somit auch auf
den *chrome* Ordner) vererbt. Diese *Vererbung* kann *überschrieben* werden oder
mittles des ``+/-`` Präfix an den Optionen spezialisiert werden.
Überschrieben würde sie z.B. mit ``Options Indexes``. Das würde zwar den
Autoindex aktivieren, jedoch hätte man alle Optionen aus dem globalen Kontext
verloren. Da in *diesem* Setup Konzept wie die "der Verbung" zur Anwendung
kommen sollen (*wir wollen die global einheitlich Optionen an einer Stelle
setzen können*) muss die `Apache Options Direktive`_ im Kontext des *chrome*
Ordners spezialisiert werden.
Mit dem ``+`` vor dem ``Options +Indexes`` wird die Option *aditiv* zu den
geerbeten Optionen hinzugefügt. Mit einem ``-`` vor der Option können geerbte
Eigenschaften abgeschaltet werden. Soll beispielsweise eine Einstellung die aus
dem globalen Kontext geerbt wurde im *chrome* Ordner abgeschaltet werden, so
muss das ``-`` als Präfix verwendet werden (``Options -Opt2Drop``).
.. hint::
Wenn das ``+/-`` Präfix in einer Resource für eine Option angewendet wird,
muss es für alle Optionen in dieser Resource angewendet werden. Direktieven
wie ``Options Indexes`` führen dazu, dass der Autoindex zwar eingeschaltet
würde, aber gleichzeitig alle geerbten Optionen verloren gehen würden (wegen
dem fehlenden ``+/-`` vor ``Indexing``). Solche gemischten Notationen führen
zu verwirrenden Ergebnissen, weshalb man sich in einer Resource immer dafür
entscheiden sollte die Vererbung zu spezialiseren (nur ``+/-``) oder komplett
zu verwerfen. Bei Letzterem müssen dann alle Optionen ohne das Präfix notiert
werden.
.. _xref_server_side_include:
Serverside Includes
===================
Die Generierung der HTML-Seiten mit der Auflistung der Dateien in einem Ordner
ist in diesem Setup mittels Server Side Includes (SSI) relalisiert (siehe
`Introduction to SSI`_).
SSI sind umstritten, sie sollten nur mit Umsicht eingesetzt werden. Dazu gehört,
dass in KEINEM Fall die ``#exec`` -Direktieve verwendet wird! Hier im Setup
werden SSI nur verwendet, um die Autoindex-Seiten etwas *aufzubrezeln* und es
werden die SSI-Skripte **NUR** im Kontext des Chrome-Ordners aktiviert
(vergleiche :ref:`xref_static_content_chrome`).
.. code-block:: apache
AddType text/html .shtml
AddHandler server-parsed .shtml
Im Chrome Ordner gibt es auch nur zwei kleine SSI-Skripte für den *Header* und
die *Readme* des Autoindex. Will ein Autoindex in einem anderen Kontext diese
verwenden, muss er nur die beiden Dateien aus dem Chrome-Ordner setzen.
.. code-block:: apache
HeaderName /chrome/header.shtml
ReadmeName /chrome/footer.shtml
Da auch der Chrome Ordner mit dem Autoindex *navigierbar* ist, werden sie auch
im Chrome Ordner gesetzt (vergleiche :ref:`xref_static_content_chrome`).
.. caution::
Andere Kontexte als der Chrome-Ordner **sollen keine** SSI-Skripte
aktivieren. Sie benötigen keine ``AddHandler server-parsed .shtml``
Direktieve.