Webserver/htaccess/Verzeichnisoptionen
- einfach
- 20min
- ● Dateiorganisation
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.
Inhaltsverzeichnis
Verzeichnis-Optionen einstellen
Options
# 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.+IncludesNOEXE
C 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.
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.
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
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: .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-Typtext/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-Typtext/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-Typtext/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-Subtypjavascript
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 Dateikopf.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 Dateifuss.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-Subtypjavascript
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 Dateienkopf.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 anSuppressDescription
unterdrückt KurzbeschreibungenSuppressLastModified
unterdrückt Zeitstempel bei den EinträgenSuppressSize
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.
## 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.
/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
- apache.org: mod_alias-Dokumentation