.htaccess (Apache Zugriffssteuerung)

Auf den meisten Servern läuft das Opensource System Apache. Um den Zugriff auf Webinhalte zu steuern wird die ".htaccess" Datei verwendet. Über diese lassen sich eine Reihe von Funktionen deklarieren welche vom Apache System bei jedem Zugriff ausgewertet werden. So lassen sich sicherheitsrelevante regeln beschreiben.
Hier ist nun eine kurze Zusammenfassung der wichtigsten Möglichkeiten zu finden. Ausführliche Beschreibungen findet man auf der Seite Apache-Configuring.
Die ".htaccess" Datei muß klein geschrieben werden, und sollte für die Hauptanwendungen im Stammverzeichnis liegen. Es können aber auch weither ".htaccess" in Unterverzeichnissen verwendet werden.

Kommentare

Kommentare lassen sich mit einem "#"-Zeichen einfügen. Alles nach diesem Zeichen wird ignoriert.

Inhaltsverzeichnisse auslesen

Meistens ist es nicht erwünscht, dass die Inhaltsverzeichnisse von Webseiten ausgelesen werden können. Dies kann über das Schlüsselwort "Options" und entsprechende Parameter verhindert werden.
"+"-Pluszeichen aktiviert die Funktion, "-"-Minuszeichen deaktiviert sie

#Inhaltsverzeichnisse auslesen
#  "-Indexes" Auslesen des Verzeichnisses
#  "-MultiViews" bewirkt das Multilinguale Seiten ausgegeben werden, statt Index.htm index.htm.de oder index.htm.en
#  "+FollowSymLinks" leitet 403 Fehler auf die "403.shtml" Datei um, so kann eine individuelle Fehlerseite verwendet werden.
Options -Indexes -MultiViews +FollowSymLinks

Zugriffssicherung

Um sicherzustellen, dass niemand an die ".htaccess"-Dateien gelangen kann, können diese Dateinamen grundsätzlich gesperrt werden.

#Verhindert, dass jemand die ".ht*"-Dateien auslesen kann. Der Zugriff auf diese Daten wird verboten
<Files ~ "^[\._]ht">
    Order allow,deny
    Deny from all
    Satisfy All
</Files>

Redirect

Über sogenannte Redirects können Seiten umgelenkt oder Links korrigiert werden. Dies ist sowohl innerhalb der Domain selbst möglich, wie auch Verweise außerhalb auf eine anderen Domain-Namen. So können alte Seiten auf die neuen verwiesen werden, oder auch wenn ein neuer Domain-Name verwendet wird, kann auf der alten Adresse so auf die neue verwiesen werden.
Dies wird über die "RewriteEngine" Funktion erreicht, mit welcher sich beliebige Linktexte austauschen lassen. zB lassen sich so für einen Domain-Namen, die sowohl mit wie ohne www erreichbar ist, die bevorzugte Variante erzwingen.
Die Texte lassen sich über Reguläre Ausdrücke festlegen, ebenso sind bestimmte Variablen erlaubt, welche als Stellvertreter für bestimmte Informationen gebraucht werden können.

#Redirecting
#  RewriteEngine einschalten
RewriteEngine on
 
#  Über bestimmte Suchmuster Seiten umleiten und so auch vor Zugriff schützen.
#    Hier wird beim Zugriff auf bestimmte Verzeichnisse auf das Stammverzeichnis der Domain verwiesen.
RedirectMatch permanent ^/temp/ http://domainname.net/
 
#  Verschiedene Domain-Namen alle auf einen Namen umleiten (das ''[OR]'' bedeutet oder)
#    Hier werden die www Variante und veraltete Domains umgeleitet
RewriteCond %{HTTP_HOST} ^www.domainname.net$    [OR]
RewriteCond %{HTTP_HOST} ^www.alter-domainname.net$ [OR]
RewriteCond %{HTTP_HOST} ^alter-domainname.net$
RewriteRule ^(.*)$ http://domainname.net         [R=301,L]
 
#  Hier werden über Regeln URLs korrigiert
#    Index als HTM(L) wird an ein PHP-Scripts
RewriteRule ^index.html?$             index.php  [L]
RewriteRule ^$                        index.php  [L]
#    Direkte eingaben wird zu einem Parameter korrigiert
RewriteRule ^(.*)$                    index.php?id= [QSA,L]
RewriteRule ^_list/([^/]+)/(.*)     index.php?do=list_$1&id=$2  [QSA,L]
#    Falsche Formate werden an die richtigen PHP-Scripts geleitet
RewriteRule ^_text/(.*)               script/text.php?text=$1  [QSA,L]
#    ... oder HTM wird zu HTML korrigiert
RewriteRule ^index.htm$               index.html  [L]

Blocken

Wer bösartige Zugriffe auf seine Webinhalte bemerkt hat, kann diese über dessen IP von der eigenen Seite fernhalten. Oder auch wenn man den Crawler-Bot einer bestimmten Suchmaschine nicht auf der Webseite haben will, der sich nicht an die robots.txt Anweisungen hält.
Schädliche Programme können diese natürlich auch fälschen, dies ist also keine 100%-Sicherheit

#Sperrt bestimmte Programme die sich über den "Agent" identifiziert haben aus.
#  RewriteEngine einschalten
RewriteEngine On
#  Alle diese Agenten Zugang verweigern (alle Einträge mit [OR] abschließen außer der letzte)
RewriteCond %{HTTP_USER_AGENT} ^Agent1       [OR]
RewriteCond %{HTTP_USER_AGENT} ^Agent2\ mehr [OR]
RewriteCond %{HTTP_USER_AGENT} Agent3        [OR]
RewriteCond %{HTTP_USER_AGENT} AgentA|AgentB [OR]
RewriteCond %{HTTP_USER_AGENT} Agent4$       [OR]
RewriteCond %{HTTP_USER_AGENT} ^Agent5
#  Wenn einer der oberen Anweisungen zutrifft, Zugang verweigern (HTTP Antwort 403)
RewriteRule ^.* - [F,L]


Es können auch IPs direkt ausgesperrt werden, zB wenn es sich um ein bekannten Schädling handelt.
Es gibt statische und dynamische IP-Adressen. Die meisten Personen bekommen von ihrem Provider eine dynamische IP zugewiesen, welche nur für einen kurzen Zeitraum gültig ist. Diese zu blocken hat wenig Sinn und trifft möglicherweise ein Unschuldigen, dem diese IP später zugewiesen wird.

#IPs sperren
RewriteCond %{REMOTE_ADDR} ^1\.2\.3\.4 [OR]
RewriteCond %{REMOTE_ADDR} ^1\.2\.3\.5 [OR]
RewriteCond %{REMOTE_ADDR} ^1\.2\.3\.6
RewriteRule ^.* - [F,L]


Und auch Referer-Texte, welche anzeigen sollen, von wo aus auf diese Seite gewechselt wurde, werden manchmal zum Spammen missbraucht, um in den Logs registriert zu werden.

#Referer sperren
RewriteCond %{HTTP_REFERER} SpamWort       [OR]
RewriteCond %{HTTP_REFERER} ^http://www.spam.com$
RewriteRule ^.* - [F,L]


Einige Verzeichnisse sollen vielleicht auch überhaupt nicht von Außen erreichbar sein, für niemand. Dann fügt man am besten eine ".htaccess"-Datei in dieses Verzeichnis ein mit folgendem Code. Sie sind dann so nur noch über FTP oder durch serverseitige Anwendungen wie ein PHP-Script erreichbar.

#Alle Zugriffe verweigern
order allow,deny
deny from all

HTTP-Antworten in Dateien

Statt eine Standardausgabe für Fehler auszugeben, können so auch selbst verfasste Fehlerdokumente ausgegeben werden.
Angegeben wird der Pfad ab dem Stammverzeichnis auf dem Server, nicht der URL-Link.

#Für die wichtigsten Fehlerausgaben eine eigene Meldung ausgeben
ErrorDocument 400 /domainname/400.shtml
ErrorDocument 401 /domainname/401.shtml
ErrorDocument 403 /domainname/403.shtml
ErrorDocument 404 /domainname/404.shtml
ErrorDocument 410 /domainname/410.shtml
ErrorDocument 500 /domainname/500.shtml

Regulären ausdrücke

Kurze Beschreibung der hier verwendeten Regulären ausdrücke.

RegExBeschreibung
^Anfang der Zeile
$Ende der Zeile, (oder auch Platzhalter für gefundenen Ausdruck.)
|Varianten
?der vorangehende Ausdruck 0 oder 1 mal ("html?" findet "htm" und "html")
"\ "Lehrschlag: (Ohne "") das Lehrzeichen trennt die Anweisungen Parameter, um dies bei einem Text mit einem Lehrzeichen zu vermeiden nur "\ " geschrieben werden.
\."."-Punkt, das Punkt ist ein Syntaxzeichen, deshalb muß es ebenfalls mit "\" benutzt werden.
([^/]+)Ein beliebig lange aber mindestens 1 Zeichen lange Zeichenfolge ohne das "/"-Zeichen
(.*)Eine beliebige Zeichenfolge
$1 $2Platzhalter für Ausdrücke welche in "()" beschrieben wurden. Der da gefundene Text wird an Stelle von $1 eingefügt, numeriert nach dem Auftreten der "()" Ausdrücke.
/([^/]+)/(.*)Findet zB "/dir/file"...
index.php?id1=$1&id2=$2... und schreibt dies um zu "index.php?id1=dir&id2=file"

Dabei gilt in einem URL im Zusammenhang mit PHP "?" als Begrenzung zwischen Link und Parameter, und "&" trennt die Parameter untereinander.

Rewrite Schlüsselwörter

"Rewrite"-Regel [Schlüsselwörter] Steuern das Verhalten der Ergebnis der Anweisungen

ParameterBeschreibung
[OR]Oder: und dann folgend die nächste "Rewrite"-Regel
[NC]No Case: Groß- und Kleinschreibung spielen keine Rolle
[NC,OR]Beides
[L]Last Rule: Weitere Regeln werden nicht mehr angewandt (wichtig, falls man in der selben ".htaccess" Datei weitere Regeln verwendet)
[R=301,L]HTTP Antwort: "301 Object permanently moved"
[QSA,L]WRITEME
[F,L]HTTP Antwort: "403 Forbidden. Zugriff verweigert".
[I,L]WRITEME

Server Variablen

WRITEME


Diverses/Server/htaccess.txt · Zuletzt geändert: 2009/10/08 08:43 (Externe Bearbeitung)