Was ist .htaccess?
Mit Hilfe von .htaccess kann man Einstellungen, die von der Grundkonfiguration des Webservers abweichen sollen, eintragen. Das ist z.B. nützlich, wenn Sie die Art und das Aussehen eines Verzeichnislistings bestimmen wollen, eigene Fehlerseiten einsetzen oder den Zugriff auf bestimmte Verzeichnisse einschränken wollen.
.htaccess ist ursprünglich ein Kind des Apache- Webservers, welcher im WWW weit verbreitet ist und wurde von einigen anderen Anbietern (NCSA, NES, SAMBAR) übernommen. Der Microsoft IIS kennt .htaccess in dieser Form nicht!
Wie funktioniert .htaccess?
In einer Datei (normalerweise heisst sie '.htaccess') werden die speziellen Einstellungen eingetragen. Diese Datei wird in dem Verzeichnis abgelegt, für welches die Einstellungen gelten sollen. Erhält der Webserver einen Request auf dieses Verzeichnis, so liest er die Datei '.htaccess' und führt die darin enthaltenen Anweisungen durch. Dieses Verfahren ist vor allem dazu gedacht, dass Benutzer Vorgaben für ihr 'public_html'-Verzeichnis ändern können.
Die .htaccess gilt für das aktuelle, sowie alle darunterliegenden Verzeichnisse, es sei denn, es liegt im weiterführenden Verzeichnisbaum eine weitere .htaccess vor.
Warum gehört der Punkt vor .htaccess?
Bei Unix- Betriebssystemen wird allen Dateien, die mit einem normalen ls (List) nicht angezeigt werden sollen, ein Punkt vorangesetzt. Es handelt also um eine Art versteckte Datei.
Muss die .htaccess .htaccess heissen?
Nein, .htaccess ist der Standardname dieser Konfigurationsdatei, wie sie mit dem Apache- Webserver geliefert wird. Natürlich kann man den Dateinamen ändern, indem man in der httpd.conf beispielsweise folgenden Eintrag macht:
AccessFileName .irgendnedatei
Damit wird in allen Unterverzeichnissen die Datei .irgendnedatei als htaccess-Datei verwendet. Man kann auch mehrere Dateien definieren:
AccessFileName .datei .datei2
So werden die beiden Dateien .datei und .datei2 als htaccess-Datei verwendet.
Beispiel einer .htaccess
AuthName "N8i's htaccess Demo" AuthType Basic AuthUserFile /home/projects/www/htdocs/secure/.htpasswd <Limit GET POST> require valid-user </Limit> Options +Includes +ExecCGI DirectoryIndex index.html AddDescription "Ein tolles Bild." /www/html/graphic.jpg AddDescription "Eine Grafik" graphic.jpg AddEncoding x-gzip gz AddEncoding x-compress Z AddType image/jpeg jpg AddType image/gif gif AddIcon /icons/continued.gif ^^DIRECTORY^^ AddIcon /icons/unknown.gif ^^BLANKICON^^ AddIcon /icons/box1.gif *g* AddIcon /icons/a.gif html AddIconByEncoding /icons/box1.gif x-compress ErrorDocument 404 /www/error/error_404.html ErrorDocument 500 http://www.nightfire.ch/www/error/error_500.html ErrorDocument 403 "Kein Zugriff.
<Limit GET POST> require valid-user </Limit>
Options +Includes +ExecCGI
DirectoryIndex index.html
AddDescription "Ein tolles Bild." /www/html/graphic.jpg AddDescription "Eine Grafik" graphic.jpg AddEncoding x-gzip gz AddEncoding x-compress Z AddType image/jpeg jpg AddType image/gif gif AddIcon /icons/continued.gif ^^DIRECTORY^^ AddIcon /icons/unknown.gif ^^BLANKICON^^ AddIcon /icons/box1.gif *g* AddIcon /icons/a.gif html AddIconByEncoding /icons/box1.gif x-compress
ErrorDocument 404 /www/error/error_404.html ErrorDocument 500 http://www.nightfire.ch/www/error/error_500.html ErrorDocument 403 "Kein Zugriff.
Zugriffsbeschränkung auf Verzeichnisse
Der wohl häufigste Grund, eine .htaccess einzusetzen, ist die Möglichkeit, damit den Zugriff auf Verzeichnisse und Dateien auf dazu berechtigte Benutzer einzuschränken, indem man den Zugang auf die Verzeichnisse mit einem Passwort belegt.
Um einen solchen Zugriffsschutz einzurichten, müssen neben der .htaccess noch eine (oder zwei) Dateien auf den Web-Server gestellt werden : Die eigentliche Paßwortdatei .htpasswd und bei Bedarf eine Gruppendatei .htgroup.
AuthName "N8i's htaccess Demo" AuthType Basic AuthUserFile /home/projects/www/htdocs/secure/.htpasswd <Limit GET POST> require valid-user </Limit>
Mit <Files> können einzelne Dateien oder Dateigruppen geschützt werden. Bei der Angabe der Dateien können Wildcards benutzt werden, und zwar der Stern "*" für eine beliebige Anzahl von Zeichen und das Fragezeichen "?" für genau ein Zeichen. So kann z.B. mit <Files *.htm*> der Zugriff auf alle HTML-Documente geschützt werden, während der Zugang auf andere Dateitypen im gleichen Verzeichnis (z.B. Bilder) frei ist.
Order allow,deny Hiermit geben Sie die Reihenfolge an, in der die Directiven ausgewertet werden.
Allow from gibt an, wem der Zugriff gestattet wird Deny from gibt an, wem der Zugriff verweigert wird
require Mit der require-Directive wird angegeben, nach welchem Kriterium Benutzer zugelassen werden sollen. Es gibt hier drei alternative Möglichkeiten : require user user1 user2 ... Gibt den Bereich gezielt nur den aufgelisteten Benutzern user1, user2 usw. frei. Diese Alternative erfordert einen hohen Pflegeaufwand. require valid-user Gibt den Bereich für alle in der Paßwortdatei definierten Benutzer frei. Dies ist die am häufigsten verwendete Form, sie ist im Allgemeinen die Alternative, die sich am einfachsten pflegen läßt. require group group1 group2 ... Es dürfen Benutzer zugreifen, die einer der aufgeführten Gruppen group1, group2 usw. angehören. Diese Variante bietet sich an, wenn man verschiedene Bereiche mit unterschiedlichen Zugriffsrechten versehen will, aber nur eine Paßwortdatei pflegen möchte.
.htpasswd
Die Datei .htpasswd ist die eigentliche Paßwortdatei. Sie kann z.B. so aussehen :
nightfire:32/a7xZJFbDoo firenight:7dWdiLtedT8hA
Jede Zeile in der Datei definiert eine Benutzername/Passwort-Kombination. Es wird zuerst der Benutzername angegeben, gefolgt von einem Doppelpunkt. Dahinter steht das mit der Unix-Funktion crypt() verschlüsselte Passwort, das aber laut man-page nicht wirklich sicher ist. Wenn also jemand Zugriff auf die Paßwort-Datei auf dem Server hat, ist Ihr Sicherheitskonzept löchrig - auch wenn das nur in wenigen Fällen relevant werden dürfte. Die Datei .htpasswd sollte also nach Möglichkeit gegen Zugriff über http geschützt werden. Am besten legen Sie die Datei in einem Verzeichnis ab, das nicht unterhalb der Document-Root liegt. Diese Möglichkeit besteht aber bei den vielen Providern nicht. In diesem Fall legen Sie ein eigenes Verzeichnis für die Paßwortdatei(en) an und schützen dieses Verzeichnis wiederum mit Paßwort (require user eigener-user).
Wenn Sie eine neue Datei erstellen wollen, rufen Sie das Programm mit htpasswd -c Dateiname Username auf. Wenn die Datei bereits existiert (also ab dem Hinzufügen des zweiten Benutzernamens), lassen Sie das -c weg. Sie werden nun zur Eingabe des Paßworts und zu dessen Wiederholung aufgefordert. Wenn es keine Fehlermeldungen gab, wurde die Datei korrekt mit Username und verschlüsseltem Paßwort angelegt.
Wenn Sie keine Programme auf Ihrem Server ausführen lassen können, können Sie sich die Datei auch selbst basteln, indem Sie den User-Namen gefolgt von einem Doppelpunkt eingeben und dann das verschlüsselte Paßwort dahinter kopieren. Die Verschlüsselung können Sie in diesem Fall über einige Seiten im WWW durchführen lassen:
http://www.cache-22.co.uk/cgi-local/c22encrypt.pl http://www.linux-profis.de/php3/crypt.php3
Bei vielen Providern, die die Verwendung der .htaccess anbieten, wird oft im Konfigurationsmenü eine entsprechende Möglichkeit angeboten, alles interaktiv zu erstellen.
Grenzen der Sicherheit
Wenn noch andere auf den Server Zugriff haben sollten, müssen Sie bedenken, daß htaccess nur den Zugriff über das Internet beschränkt. Wer sich auf dem Server einloggt, kann Ihre Seiten ganz einfach anschauen. Diesen Zugriff können Sie nur mit der Vergabe von Zugriffsrechten auf der Ebene des Betriebssystems verhindern.
.htgroup
In der Datei .htgroup können Benutzergruppen definiert werden; sie gibt an, welcher Benutzer zu welcher Gruppe gehört. Die Datei kann z.B. so aussehen :
group1: user1 user2 user3 group2: fritz hans peter
Eine Gruppe wird definiert durch den Namen der Gruppe, gefolgt von einem Doppelpunkt und dann einer Anzahl von Benutzernamen derjenigen Anwender, die der Gruppe zugeordnet werden sollen. Die bei der Gruppendefinition angegebenen Benutzernamen müssen sich in der Paßwortdatei wiederfinden.
Neben der Zugriffsbeschränkung bietet die .htaccess einige weitere interessante Konfigurationsmöglichkeiten.
Definieren der Indexseite
Mit folgendem Eintrag kann die Indexseite definiert werden, die aufgerufen wird, wenn der Webserver einen Request erhält, der keine spezifische HTML- Seite enthält.
DirectoryIndex index.html index.htm index.shtml
Wenn Sie http://www.nightfire.ch/ in die Adresszeile Ihres Browsers eingeben, wird Ihnen, obwohl Sie keine HTML- Seite anfordern, die Datei index.html angezeigt. Der Webserver überträgt in diesem Falle die definierte Indexseite.
Werden mehrere Standarddokumente definiert, werden Sie in der angegebenen Reihenfolge gesucht und beim Auffinden der ersten Datei wird diese angezeigt. Liegt keine der definierten Dateien in dem betreffenden Verzeichnis, so sendet der Webserver ein Verzeichnislisting.
Eigene Fehlermeldungen definieren
Ein Webserver antwortet auf jeden HTTP- Request mit einem HTTP- Response, welcher wiederum einen Statuscode enthält (siehe auch Knowledge - TCP/IP ). Falls der Webserver den Request nicht ausführen kann, sendet er eine entsprechende Fehlermeldung an den Client. Diese Fehlermeldung wird in Form eines einfachen Textstrings oder einer HTML-Seite versandt, in der erklärt wird, welcher Fehler aufgetreten ist. Diese Fehlermeldung, bzw. -seite können Sie selbst bestimmen:
- reine Textmeldung
ErrorDocument 500 "Ein interner Fehler ist aufgetreten. Bitte informieren Sie den Betreiber der Webseite, falls der Fehler wieder auftritt. ErrorDocument 400 "Bad Request! Die Anforderung war syntaktisch falsch und kann nicht ausgeführt werden.
Das Anführungszeichen ist hier nicht geschlossen. Dies ist kein Schreibfehler, das muss tatsächlich so sein.
- definieren einer HTML- Seite
ErrorDocument 500 /www/html/error/error_500.html
Achten Sie hierbei darauf, keinen relativen Pfad anzugeben! Möglich ist auch die Angabe einer Webadresse (URL):
ErrorDocument 500 http://www.nightfire.ch/error/error_500.html
Konfiguration von Optionen
Um weitere Optionen zu konfigurieren, verwenden Sie den Befehl Options. Hierbei können Optionen hinzugefügt oder entfernt werden. Dazu setzt man vor die Option entweder ein Pluszeichen (hinzufügen einer Option) oder ein Minuszeichen (entfernen einer Option).
Options +ExecCGI -Indexes -IncludesNOEXEC
FancyIndexing
Mit FancyIndexing ist es möglich, dem Verzeichnislisting, falls erlaubt und keine Indexdatei vorhanden, ein Aussehen zu geben, welches dem Design Ihrer Website angepasst ist. FancyIndexing wird mit dem Befehl FancyIndexing On aktiviert. FancyIndexing bietet eine Reihe Optionen, um das Aussehen des Verzeichnislistings zu definieren.
AddDescription "Java Klassen Datei" xyz.class
Jetzt wird im Verzeichnislisting neben jeder Datei, die "xyz.class" heisst die Beschreibung "Java Klassen Datei" angezeigt. Beschreibungen gelten für alle Unterverzeichnisse.
Im Dateinamen können auch Wildcards eingesetzt werden ("*" und "?").
AddEncoding x-gzip gz AddEncoding x-compress Z
AddType text/plain txt
AddIcon /icons/htm1.gif html
Bei diesem Beispiel wird bei jeder Datei, die die Endung html hat, das Bild /icons/htm1.gif angezeigt. Der absolute Pfad zum Bild geht hier vom DocumentRoot des Webservers aus.
Icons können nicht nur Dateiendungen zugeordnet werden, sondern auch einzelnen Dokumenten.
AddIcon /icons/nfx1.gif nightfire.html
So enthält jede Datei, die den Namen nightfire.html besitzt als Icon die Datei /icons/nfx1.gif.
Eine weitere Möglichkeit besteht darin, Verzeichnissen eigene Icons zuzuordnen.
AddIcon /icons/dir1.gif ^^DIRECTORY^^
Der String ^^DIRECTORY^^ steht für Verzeichnis. So wird jedem Verzeichnis das Icon /icons/dir1.gif zugeordnet.
Auch hier können Wildcards eingesetzt werden:
AddIcon /icons/jaicon.gif ja*.html
Damit weist man jeder Datei, die mit ja beginnt und mit .html endet, das Icons /icons/jaicon.gif zu.
AddIconByEncoding /icons/zip.gif x-compress
Hiermit wird allen Dateien, die den MIME-Encoding-Type x-compress haben, das Icon /icons/zip.gif zugewiesen. Wichtig: Der MIME-Encoding-Type muss vorher spezifiert worden sein (siehe oben).
AddIconByType /icons/txt.gif text/html
DefaultIcon /icons/def_icon.gif
So wird allen Dateien, für die nicht explizit ein Icon zugewiesen worden ist, das Icon /icons/def_icon.gif zugewiesen. Der Pfad zum Icon muss absolut, vom DocumentRoot des Webservers aus gesehen, sein.
HeaderName HEADER
Die Datei HEADER muss sich im selben Verzeichnis befinden, ansonsten wird das herkömmliche Listing angezeigt.
ReadmeName README
In diesem Beispiel wird der Inhalt der Datei README anstelle der Standardanzeige angezeigt.
IndexIgnore .htaccess *.dat *.cgi
IndexOptions IconHeight=60 IconWidth=35 IconsAreLinks ScanHTMLTitle
Dieser Befehl kennt mehrere Optionen:
Höhe und Breite müssen immer in Kombination angegeben werden, eine einzelne Angabe wird vom Webserver ignoriert.
NameWidth=15
legt fest, dass die Spalte für den Dateinamen 15 Zeichen breit sein soll. Als Wert kann auch ein Asterisk "*" verwendet werden, dann wird die Spaltenbreite aus dem längsten Dateinamen bestimmt.
"Name" (Dateiname), "Size" (Dateigrösse), "Date" (Datum der letzten Änderung) und "Description" (Beschreibung).
IndexOrderDefault Ascending Name
AddAlt "Ich bin eine Datei" datei.gif
In diesem Beispiel wird dem Icon der Datei datei.gif als Beschriftung Ich bin eine Datei zugeordnet. Die Beschriftung muss zwischen Anführungs- und Schlusszeichen stehen. Die Verwendung von Wildcards ist erlaubt.
AddAlt "Beschriftung" abc*.html
AddAltByEncoding "komprimierte Datei" x-gzip
AddAltByType "Textdatei/Plaintext" text/plain
Rewrite Engine
Ein weiteres, äusserst interessantes Feature ist die Rewrite Engine des Apache- Webservers. Das Apache Modul mod_rewrite ist ein Wahnsinnsteil, es ist ein sehr raffiniertes Modul, welches mächtige Funktionen der URL- Manipulation unterstützt. Hiermit können Sie nahezu alle Arten von URL- Manipulationen realisieren, von denen Sie immer träumten. Der Preis, den Sie dafür bezahlen müssen, ist, die Komplexität dieses Moduls zu akzeptieren, denn der Hauptnachteil von mod_rewrite ist, dass es für Beginner nicht einfach zu verstehen und anzuwenden ist.
Mit anderen Worten: Mit mod_rewrite schiessen Sie sich entweder zuerst selbst in den Fuss und wenden es nie mehr an oder Sie lieben es aufgrund seiner mächtigen Funktionen für den Rest Ihres Lebens.
An dieser Stelle möchten wir nur auf einige wenige Funktionen eingehen, die leicht zu verstehen und umzusetzen sind, und die für das Gros der Besucher dieser Webseite den grössten Nutzen bieten.
Wer sich näher damit befassen möchte, dem sei die Apache Dokumentation empfohlen.
Fremde Links sperren
Oft ist es unerwünscht, daß Download-Dateien oder Bilder von fremden Servern "gelinkt" werden. Um das zu verhindern, kann man eine Datei .htaccess mit folgendem Inhalt in das entsprechende Unterverzeichnis kopieren:
RewriteEngine on RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://unix.nightfire.ch.*$ [NC] RewriteCond %{HTTP_REFERER} !^http://www.nightfire.ch.*$ [NC] RewriteRule /* http://www.nightfire.ch/ [R,L]
In diesem Beispiel wird jeder Zugriff auf das Verzeichnis, der nicht von der Domain unix.nightfire.ch oder www.nightfire.ch erfolgt, auf eine entsprechende Seite umgeleitet.
Voraussetzung ist, dass sich alle vor fremden Links zu schützenden Dateien zusammen mit .htaccess in einem eigenen Unterverzeichnis befinden, da sonst auch externe Links zu Ihren normalen HTML-Seiten nicht mehr möglich wären.
Die erste ReWriteCond-Anweisung sorgt dafür, dass es keine Probleme gibt, wenn der Browser oder Proxy die Adresse der vorherigen Seite (Referer) nicht meldet. Die Angabe [NC] bedeutet "No Case", Gross- und Kleinschreibung wird also ignoriert. Das R in [R,L] bedeutet Redirection (Umleitung), das L beendet die Umleitungs-Regeln.
Verlinkung von Bildern sperren
Ähnlich dem vorangehenden Beispiel (bei dem übrigens auch die Verlinkung von Bildern unterdrückt wird), lässt sich hier anstelle der Originalbilder eine Ersatzgrafik einblenden, falls eine fremde Webseite versucht, Bilder direkt von Ihrem Webspace zu verlinken.
Als letzte Variante stellen wir ein Beispiel vor, um den Zugriff bestimmter Hosts auf Ihr Angebot zu verhindern. Angenommen, Sie möchten verhindern, dass bestimmte Communities wie bspw. Beepworld, deren Mitglieder für ihr Bestreben, den Inhalt ihrer Webseite vorzugsweise auf anderen Servern zusammenzuklauen, bekannt sind, auf ihren Server zugreifen, wenden Sie folgende Rewrite Rules an:
Bei Apache Version >= 1.3b6
Bei Apache Version < 1.3b6
Hierbei wird die Liste der auszusperrenden Hosts in eine Datei (im Beispiel hosts.deny) geschrieben, welche folgendermassen aufgebaut ist: