Webserver/htaccess/Verzeichnisoptionen

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Viele URLs enden mit einem Schrägstrich, zum Beispiel https://www.example.org/verzeichnis/ – sie verweisen auf ein Verzeichnis, ohne weitere Angabe einer bestimmten HTML-Datei hinter dem Schrägstrich.

Der Webserver sucht nun eine Standarddatei wie index.html, index.htm oder index.php. Wird die eingestellte Standarddatei nicht gefunden, versucht der Server, den Inhalt des Verzeichnisses aufzulisten. Empfehlenswert ist das im Normalfall nicht - aber wenn Sie einen Ordner mit Bildern veröffentlichen möchten, kann es nützlich sein, keine HTML-Seite hinzufügen zu müssen, die nichts weiter als eine Liste mit Links auf diese Bilddateien enthält.


Mit Hilfe einer .htaccess-Datei können Sie alle zentralen Verzeichnis-Optionen, die in der Konfiguration des Webservers eingestellt sind, für das entsprechende Verzeichnis und seine Unterverzeichnisse ändern. Voraussetzung ist allerdings, dass in der zentralen Webserver-Konfiguration mindestens AllowOverride Options Indexes FileInfo eingetragen ist. Wenn nicht, dann werden Angaben für andere Verzeichnis-Optionen in Ihrer .htaccess-Datei ignoriert.

Verzeichnis-Optionen einstellen

Options

.htaccess-Datei
# Datei für Verzeichnis /bilder
Options +ExecCGI -Indexes
DirectoryIndex erste.htm start.htm

Mit Options können Sie verschiedene wichtige Grundeinstellungen ändern, die der Webserver für Verzeichnisse verwendet. Hinter Options können Sie eine oder mehrere der folgenden Angaben notieren:

  • All erlaubt alles bis auf das Definieren alternativer Inhalte. Dies ist die Voreinstellung und gilt auch, wenn Sie nichts explizit angeben möchten.
  • +ExecCGI erlaubt das Ausführen von CGI-Scripts im Verzeichnis, falls es zentral nur im definierten CGI-Verzeichnis erlaubt ist, und -ExecCGI verhindert es, sofern es zentral in allen Verzeichnissen erlaubt ist.
  • +Includes erlaubt das Ausführen von Server Side Includes im Verzeichnis, falls es zentral verboten ist, und -Includes verhindert es, sofern es zentral erlaubt ist.
  • +IncludesNOEXEC erlaubt das Ausführen von Server Side Includes, die kein CGI-Script ausführen, -IncludesNOEXEC verbietet solche Server Side Includes.
  • +Indexes erlaubt Verzeichnis-Browsing, falls es zentral verboten ist, und -Indexes verhindert es, sofern es zentral erlaubt ist. Beim Verzeichnis-Browsing wird der Inhalt des Verzeichnisses im Browser aufgelistet, falls nur das Verzeichnis aufgerufen wird (z. B. https://www.example.com/bilder/) und dort keine Datei mit einem Namen zu finden ist, der „Index-Funktion“ hat.
  • +MultiViews erlaubt das Definieren nach unten alternativer Inhalte, -MultiViews schaltet es aus.

Im Normalfall ist der Webserver so konfiguriert, dass er das Stöbern im Verzeichnis zulässt, falls dort keine Datei mit Index-Funktion existiert. Das sind in der Einstellung der meisten Webserver Dateien mit Namen wie index.htm oder index.html.

  • DirectoryIndex: damit können Sie andere Dateinamen bestimmen, die in diesem Verzeichnis und seinen Unterverzeichnissen als Dateien mit Index-Funktion gelten. Sie können beliebig viele Dateinamen angeben, welche dann in der Reihenfolge ihrer Angabe geprüft werden, falls mehrere von ihnen gleichzeitig im selben Verzeichnis existieren.
Beachten Sie: Sie müssen die Vorzeichen - und + nicht unbedingt angeben. Werden sie angegeben, so bewirken sie eine Korrektur eventuell in der zentralen Konfuguration vorhandener Einstellungen. Werden sie nicht angegeben, so werden eventuelle Voreinstellungen überschrieben.

Weitere Einstellungen zu SSI

Um Dateien mit der Endung .html durch den Server nach SSI-Anweisungen durchsuchen zu lassen, bzw. dem Nutzer .shtml-Dateien als .html-Dateien zu präsentieren, gibt es verschiedene Möglichkeiten, von denen je nach System und Vorlieben der X-Bit-Hack oder das Umschreiben der URL verwendet werden sollten:

X-Bit-Hack

Beim X-Bit-Hack werden HTML-Dateien mit SSI-Anweisungen in den Dateiberechtigungen als ausführbar markiert (das X-Bit wird gesetzt, beispielsweise per chmod +x seitenname.html) und der Webserver damit angewiesen, diese Dateien wie .shtml-Dateien zu behandeln. Da die Dateiberechtigungen nicht an den Client übermittelt werden, bekommt der Nutzer davon nichts mit.
Um diese Funktion nutzen zu können, muss sie per XBitHack on aktiviert werden.

Hinweis:

Der X-Bit-Hack funktioniert nur auf Systemen, die das Setzen der Unix-Dateirechte unterstützen, also nicht unter Windows.

Diese Option funktioniert nur, weil das Markieren von Textdateien, die normalerweise keinen durch das System ausführbaren Code beinhalten, eigentlich keinen Sinn macht und dies daher vom Webserver zur Speicherung der Information „Datei enthält SSI-Anweisungen“ genutzt werden kann.

Umschreiben der URL

Eine weitere Möglichkeit stellt das Umschreiben der URL von *.html auf *.shtml dar, sodass .shtml-Dateien dem Client als .html-Dateien präsentiert werden.

  • .html-Dateien nach SSI-Anweisungen durchsuchen
RewriteEngine on
# Prüft, ob Datei oder Ordner mit dem Namen existiert
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Leitet dann ggf. intern auf eine gleichnamige shtml-Datei um...
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ $1.shtml

Durchsuchen von HTML-Dateien nach SSI-Anweisungen

Beachten Sie: Diese Option sollten Sie aus Gründen der Performance nicht verwenden.

Es ist auch möglich, den Webserver anzuweisen, alle Dateien mit der Endung .html nach SSI-Anweisungen zu durchsuchen, was den Webserver über Gebühr ausbremsen kann:

  • .html-Dateien nach SSI-Anweisungen durchsuchen
AddType text/html .html
AddOutputFilter INCLUDES .html

Verzeichnis-Browsing einstellen

Wenn Sie Verzeichnis-Browsing erlauben, sodass also bei einem Aufruf wie https://www.example.com/bilder/ der Verzeichnisinhalt aufgelistet wird, können Sie die Optik beeinflussen, mit der die Verzeichnislisten im Browser angezeigt werden. Leichter verständlich wird das, wenn Sie sich klarmachen, dass der Webserver anhand des eingelesenen Verzeichnisinhaltes dynamisch HTML-Code generiert, den der Browser dann anzeigt. Mit den hier beschriebenen Optionen können Sie diese HTML-Ausgabe beeinflussen.

Die folgende Abbildung zeigt, wie ein Browser ein Verzeichnislisting anzeigen könnte, bei dem eigene Dateibeschreibungen und Symbolgrafiken zum Einsatz kommen:

Beispiel einer Verzeichnisdarstellung
Beispiel: .htaccess-Datei

# Datei für Verzeichnis /bilder
FancyIndexing On
AddDescription "HTML-Datei, anzeigbar" .htm .html
AddDescription "GIF-Grafik, anzeigbar" .gif
AddDescription "JPEG-Grafik, anzeigbar" .jpg
AddDescription "ZIP-Archiv, downloadbar" .zip
AddIcon /src/blau.gif html htm
AddIcon /src/gelb.gif gif jpg
AddIcon /src/gruen.gif ^^DIRECTORY^^
AddIcon /src/blau.gif ^^BLANKICON^^
  • FancyIndexing On: schaltet eigene Optionen zur Darstellung des Verzeichnislistings ein. Die Einträge der übrigen Zeilen im obigen Beispiel definieren solche Anzeigeoptionen.


  • AddDescription: fügt einen kurzen Beschreibungstext hinzu, der hinter einer oder mehreren bestimmten Dateien stehen soll. Zuerst notieren Sie in Anführungszeichen den gewünschten Text, und dahinter geben Sie an, für welche Datei oder Dateien der Text gelten soll. Dabei können Sie wie im Beispiel oben Wildcards benutzen.
  • AddIcon: bestimmt eine eigene Symbolgrafik für eine oder mehrere bestimmte Dateien. Dabei geben Sie den URI der Symbolgrafik an. Bei Adressen auf der eigenen Domain können Sie mit absoluten Pfadnamen arbeiten, wobei das Wurzelverzeichnis des Web-Projekts der Ausgangspunkt ist. Hinter der Angabe zur gewünschten Grafikdatei können Sie eine oder mehrere Dateiendungen notieren. Dateien mit dieser Endung erhalten dann bei der Anzeige die entsprechende Symbolgrafik. Anstelle von Dateiendungen können Sie auch reservierte Ausdrücke wie ^^DIRECTORY^^ (Verzeichnisse erhalten diese Symbolgrafik) oder ^^BLANKICON^^ (Dateien ohne Dateiendung oder nicht zuzuordnende Dateien erhalten diese Symbolgrafik) notieren.

Weitere Optionen sind ebenfalls möglich, aber im obigen Beispiel nicht notiert:


  • AddType: ordnet MIME-Typen eine oder mehrere Dateiendungen zu.
    AddType text/xml adr ordnet beispielsweise Dateien mit *.adr dem MIME-Typ text/xml zu.
  • AddEncoding ordnet dem Sub-Typ eines MIME-Typen eine oder mehrere Dateiendungen zu.
    AddEncoding javascript jscr: ordnet beispielsweise Dateien mit *.jscr dem MIME-Typ text/javascript zu.
  • AddIconByType: ordnet einem MIME-Typen eine Symbolgrafik zu. Alle Dateien dieses MIME-Typs werden dann mit dieser Symbolgrafik angezeigt.
    AddIconByType text/xml /src/struktur.gif ordnet beispielsweise Dateien mit dem MIME-Typ text/xml eine Grafik mit der Adresse /src/struktur.gif zu.
  • AddIconByEncoding: orndet dem Sub-Typ eines MIME-Typen eine Symbolgrafik zu.
    AddIconByEncoding javascript /src/action.gif ordnet beispielsweise Dateien mit dem MIME-Subtyp javascript eine Grafik mit der Adresse /src/action.gif zu.


  • DefaultIcon: bestimmt eine Symbolgrafik für alle Fälle, die nicht durch speziellere Angaben abgedeckt sind.
    DefaultIcon /src/punkt.gif: bestimmt beispielsweise, dass alle Verzeichniseinträge, die sich nicht anderweitig zu Symbolgrafiken zuordnen lassen, die Grafik mit der Adresse /src/punkt.gif erhalten.


  • HeaderName: bestimmt eine eigene Datei für die Anzeige der Kopfinformation zum Verzeichnis.
    HeaderName kopf.htm: bestimmt beispielsweise, dass die Anzeige der Kopfinformationen aus der Datei kopf.htm im gleichen Verzeichnis geholt werden.


  • ReadmeName: bestimmt eine Datei, in der zusätzliche Informationen zum Verzeichnis stehen, z. B. Copyright-Hinweise. Diese Datei wird unterhalb der Verzeichnisliste eingebunden.
    ReadmeName fuss.htm bestimmt beispielsweise, dass die Anzeige der Liesmich-Informationen aus der Datei fuss.htm im gleichen Verzeichnis geholt wird.


  • AddAlt können Sie einer verwendeten Symbolgrafik einen HTML-Alternativtext zuordnen, falls die Grafik nicht angezeigt werden kann.
    AddAlt "das ist eine Grafikdatei" gelb.gif bestimmt beispielsweise den Alternativtext "das ist eine Grafikdatei für die Symbolgrafik gelb.gif".
  • AddAltByType können Sie allen Symbolgrafiken vor Dateien eines bestimmten MIME-Typs einen gemeinsamen HTML-Alternativtext zuordnen.
    AddAltByType "Das ist eine XML-basierte Datei" text/xml: ordnet beispielsweise allen Symbolgrafiken, die vor einer Datei mit dem MIME-Typ text/xml stehen, den angegebenen Alternativtext zu.
  • AddAltByEncoding: ordnet allen Symbolgrafiken vor Dateien eines bestimmten MIME-Subtyps einen gemeinsamen HTML-Alternativtext zu.
    AddAltByEncoding "Das ist eine XML-basierte Datei" javascript ordnet beispielsweise allen Symbolgrafiken, die vor einer Datei mit dem MIME-Subtyp javascript stehen, den angegebenen Alternativtext zu.


  • DirectoryIndex: legt fest, welche Dateinamen Index-Funktion erhalten, dass heißt, welche Datei ausgeliefert wird, wenn der Client eine URL in der Form https://www.example/ ohne Angabe eines speziellen Dateinamens anfordert. Sie können mehrere Dateinamen angeben, die entsprechend ihrer Reihenfolge vom Server gesucht werden. Die Datei mit dem ersten Namen aus dieser Auflistung, die dann auch im durchsuchten Verzeichnis gefunden wird, liefert der Server aus.


  • IndexIgnore: gibt Dateien an, die nicht im Verzeichnislisting auftauchen sollen.
    IndexIgnore kopf.htm fuss.htm nacktbild.jpg *.bmp: bestimmt beispielsweise, dass die Dateien kopf.htm, fuss.htm, nacktbild.jpg sowie alle Dateien mit der Endung .bmp nicht angezeigt werden.


  • IndexOrderDefault wird die Sortierung bestimmt. Per Voreinstellung werden die Verzeichniseinträge alphabetisch aufsteigend nach Dateinamen angezeigt.
    IndexOrderDefault Descending Name: sortiert nach Dateinamen absteigend
    IndexOrderDefault Ascending Date: aufsteigend nach Zeitstempel
    IndexOrderDefault Descending Size: absteigend nach Dateigröße
    IndexOrderDefault Ascending Description: aufsteigend nach Dateikurzbeschreibung.


  • IndexOptions: legt schließlich weitere Einzeloptionen fest.
    IndexOptions IconHeight=12 IconWidth=14 IconsAreLinks ScanHTMLTitles legt beispielsweise fest, dass Icongrafiken in der fixen Höhe von 12 Pixeln und der fixen Breite von 14 Pixeln angezeigt werden. Die Icons sind außerdem als Links anklickbar und rufen die dahinter angezeigte Datei oder das Verzeichnis auf. In der Spalte für Dateibeschreibungen werden im Fall von HTML-Dateien die Inhalte der darin definierten title-Elemente ausgelesen und als Kurzbeschreibung zur Datei angezeigt.

Weitere Optionen sind:

  • SuppressColumnSorting zeigt die Verzeichniseinträge unsortiert an
  • SuppressDescription unterdrückt Kurzbeschreibungen
  • SuppressLastModified unterdrückt Zeitstempel bei den Einträgen
  • SuppressSize unterdrückt anzeige von Dateigrößen

Security by Obscurity

Security through obscurity (deutsch „Sicherheit durch Unklarheit“) ist ein Prinzip in der Computer- und Netzwerksicherheit. Es geht davon aus, dass das Sichtbarmachen aller Skripte und Daten eines Webprojekts zu einer Gefahr führt, da Hacker dann genau wissen, welche Dateien sie ausspähen können. Auch wenn das Prinzip kritisiert wird, da man davon ausgehen muss, dass Hacker die Architektur moderner Webprojekte kennen und sich nicht auf diese Unklarheit verlassen kann, sollte man auf den Einsatz des Verzeichnis-Browsing weitgehend verzichten und es wenn überhaupt, nur für Bilder-Ordner zulassen.

Aliasing von Webverzeichnissen

Der Apache-Webserver ist ja bekannt für seine flexiblen Konfigurationsmöglichkeiten. Eine häufig verwendete Option dieses Servers ist das Modul mod_alias welches in der Standarddistribution der Software mitgeliefert wird. Es ermöglicht unter anderem das Einblenden von lokalen Verzeichnissen in den Web-Verzeichnis-Baum. Diese Alias-Funktionalität kann man zum Beispiel für serverweite CGI-Skripte verwenden. Dazu wird ein zentrales Verzeichnis auf dem Server-Rechner angelegt, welches alle Skripten enthält. Mittels ScriptAlias-Direktive wird dieses Verzeichnis im Web (ggf. bei allen virtuellen Hosts) verfügbar gemacht.

Das folgende, etwas komplexere Beispiel dient zum Aufbau eines Service-Bereichs für alle virtuellen Hosts. In diesem Service-Bereich soll es eine Startseite, eine Statistikseite und einen Bereich mit Cliparts geben. Vom Prinzip her wird so bei vielen Internet-Providern verfahren. Das Verzeichnis /usr/local/docroot-service/ enthält die Dateien des Wurzelverzeichnisses unseres Servicebereichs. Dieses soll erreichbar sein unter http://domainname.tld/service/. Das Verzeichnis /usr/local/stat-software/ enthält die CGI-Skripte für das Statistiktool. Es soll innerhalb des Servicebereichs unter http://domainname.tld/service/statistik/ erreichbar sein. Das dritte Verzeichnis /data/all-users/cliparts/ enthält Web-Clipart und soll unter http://domainname.tld/service/clipart verfügbar gemacht werden.

Unser Service-Bereich soll natürlich ggf. von allen virtuellen Hosts des Servers aus erreichbar sein, weshalb die folgenden Konfigurationen in der Main Server Configuration (so wird sie in der Standard-Konfiguration des Apache genannt) eingebaut werden müssen. Das Beispiel zeigt eine Alias-Konstruktion für unseren Service-Bereich.

Beachten Sie: Dies ist nur ein Beispiel für die Alias-Konstruktion im Apache. Es werden grundlegende Kenntnisse des Apache-Servers und seiner Konfiguration vorausgesetzt. Das Beispiel wurde getestet mit der Apache-Version 1.3.26.


Beispiel
## Alias für den Statistikbereich
ScriptAlias /service/statistik /usr/local/stat-software
<Directory /usr/local/stat-software>
    Options All

    #Authentifikation eines Webusers erforderlich
    AuthUserFile /usr/local/http-auth/htpasswd
    AuthName ByPassword
    AuthType Basic

    <Limit GET>
            Require valid-user
    </Limit>
    #Ende Webuser-Authentifikation

    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

## Alias für die Clipart-Bibliothek
Alias /service/clipart /data/all-users/cliparts
<Directory /data/all-users/clipart>
    Options MultiViews

    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

## Standardalias für Service-Bereich
Alias /service /usr/local/docroot-service
<Directory /usr/local/docroot-service>
    Options Indexes MultiViews

    #Authentifikation eines Webusers erforderlich
    AuthUserFile /usr/local/http-auth/htpasswd
    AuthName ByPassword
    AuthType Basic

    <Limit GET>
            Require valid-user
    </Limit>
    #Ende Webuser-Authentifikation

    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

Das Beispiel richtet die drei oben genannten Aliase ein. Der erste Abschnitt mit der ScriptAlias-Direktive verweist auf das Verzeichnis mit den CGI-Skripten des Statistiktools. Innerhalb der Directory-Direktive wird festgelegt, dass für den Zugriff ein authentisierter Benutzer vorhanden sein muss. Die Benutzer unseres Servicebereichs sind in der Datei /usr/local/http-auth/htpasswd gespeichert. Für weitere Informationen dazu lesen Sie bitte den htaccess-Featureartikel von Michael Schröpl. Hier wird vorausgesetzt, dass das Skript für die Statistikauswertung auch den HTTP-Benutzer und die Domain, von der es aufgerufen wird, berücksichtigt. Statistik-Tools wie z. B. AWStats unterstützen dies und sind somit geeignet für diese Vorgehensweise. Denn je nach Benutzername und Domain müssen natürlich andere Statistiken ausgegeben werden.

Der zweite Abschnitt stellt die Clipart-Seiten im Service-Bereich bereit. Das Verzeichnis /data/all-users/cliparts/ sollte dazu natürlich Übersichtsseiten in HTML enthalten. Die Ausführung von CGI-Skripten ist in diesem Verzeichnis nicht erlaubt. Solche Verzeichnisse können natürlich noch mehr enthalten. Beispielsweise Dokumentationen, Hotline-Nummern und vieles mehr.

Der dritte Abschnitt stellt den übergeordneten Service-Bereich zur Verfügung. Auch hier ist in jedem Fall eine Authentifikation erforderlich. Dazu wird dieselbe Benutzerdatei (/usr/local/http-auth/htpasswd) wie im Statistik-Bereich verwendet. Dieses Vorgehen verhindert Redundanzen bei der Pflege der Benutzerliste.

Beachten Sie: In unserem Beispiel ist das wichtigste die Reihenfolge der Alias-Direktiven. Die untergeordneten Bereiche müssen immer als erstes eingerichtet werden. Der Versuch, zuerst das /service/-Alias und danach z.B. /service/statistik/ einzurichten schlägt fehl. Zwar gibt der Apache keinen Fehler aus, aber im Web wäre in diesem Fall nur der /service/-Bereich verfügbar, nicht aber /service/statistik/. Die Funktionen des mod_alias-Moduls sind äußerst mächtige Werkzeuge. Vor allem für Administratoren von Webservern mit mehreren virtuellen Hosts ist der gezielte Einsatz von Aliasen eine enorme Arbeitserleichterung.


Weblinks