Servereinstellungen per .htaccess

Das Schweizer Taschenmesser für die Konfiguration des Webservers

Mit der .htaccess Datei lassen sich die Einstellungen des Apache Webservers konfigurieren: Zugriffsschutz, Sperrungen, Weiterleitungen, Fehlermeldungen. Auf dieser Seite beschreiben wir die häufigsten Einstellungen.

.htaccess - Allgemeine Infos

Eine .htaccess Datei befindet sich in der Regel im Basisverzeichnis einer Webseite (das Verzeichnis, das in den Domain Einstellungen als Zielpfad eingetragen ist). 

Die Einstellungen sind im aktuellen Verzeichnis und allen Unterverzeichnisse wirksam. Mit einer .htaccess Datei in einem Unterverzeichnis lassen sich jedoch Einstellungen überschreiben.

Die .htaccess Datei wird bei jedem Aufruf des Apache Webservers und für jede einzelne Komponente der Webseite ausgewertet. Wenn eine Seite aus 1 HTML Datei, 5 CSS Dateien, 10 Javascript Dateien und 40 Bildern/Icons besteht, wird die .htaccess Datei beim Aufruf der Webseite also 56 mal durchlaufen.

Der Webserver ist übrigens sehr pingelig was die korrekte Schreibweise der Einträge angeht. Der kleinste Fehler führt in der Regel zu einem "Server Error 500". Daher muss nach jeder Änderung an der .htaccess Datei geprüft werden, ob die Webseite noch aufgerufen werden kann.

Weiterleitungen (Redirects)

Die Weiterleitung von Domains und Anfragen zu einzelnen Webseiten ist eine der Hauptanwendungen der .htaccess Datei. Das notwendige Apache Modul mod_rewrite ist in unseren Hosting Tarifen vorhanden. 

Die Weiterleitung muss jedoch in der .htaccess Datei zunächst mit folgendem Eintrag aktiviert werden (in den weiteren Beispielen haben wir folgende Zeile weggelassen, also bitte ein Mal oben in der Datei einfügen):

RewriteEngine On
...

301 oder 302 Weiterleitung?

Der Weiterleitung (Redirect) sollte man noch einen Statuscode mitgeben: 301 oder 302. Worin liegt der Unterschied? 

301: die Weiterleitung ist dauerhaft, z.B. weil die Navigationsstruktur einer Webseite umgestellt wurde

302: die Weiterleitung erfolgt nur vorübergehend, anschließend gilt wieder die bisherige Adresse

Am Ende der RewriteRule Zeile wird der Code für die Weiterleitung (Redirect) in eckigen Klammern angegeben. Mit dem zusätzlichen Parameter L (Letzter, Last) kann man festlegen, dass die weiteren Anweisungen in der .htaccess Datei ignoriert werden sollen. Hierzu ein Beispiel:

...
RewriteRule ^neues\.html$ /aktuelles.html [R=301,L]

Damit wird die Seite domain.tld/neues.html dauerhaft auf domain.tlld/aktuelles.htmlweitergeleitet.

Die Schreibweise der Rewrite Regeln basiert dabei auf "Regulären Ausdrücken" (Regular Expressions, regex). 

Mit den Zeichen ^ und $ wird Anfang und Ende der umzuleitenden Seite gekennzeichnet. Der Punkt . steht in regulären Ausdrücken für ein beliebiges Zeichen, wenn wir wirklich einen Punkt meinen, dann wird dies mit einem Backslash \ gekennzeichnet (\ bedeutet also: exakt das nächste Zeichen). 

Besonderheit: Anker auf einer Seite

Auf einer Webseite können "Anker" als Sprungmarke gesetzt sein. Beim Aufruf wird im Browser nicht auf den Anfang der Seite sondern direkt zum Ankerpunkt gesprungen. Der Anker wird durch ein Hash-Zeichen # in der URL gefolgt vom Namen der Sprungmarke gekennzeichnet. Beispiel für eine Adresse mit Anker:

domain.tld/aktuelles.html#artikel25

Soll per .htaccess Weiterleitung direkt auf eine Sprungmarke verwiesen werden, muss der zusätzliche Parameter NE (No Encoding) in eckigen Klammern angegeben werden:

...
RewriteRule ^neues\.html$ /aktuelles.html#artikel25 [R=301,L,NE]

Domain auf verschlüsselte Verbindung umleiten

Sollen alle Seiten einer Domain ausschließlich über eine SSL-Verbindung aufgerufen werden, so kann dies über einen Eintrag in der .htaccess Datei im Startverzeichnis der Domain eingerichtet werden:

...
RewriteCond %{SERVER_PORT} !^443$
RewriteRule (.*) https://%{HTTP_HOST}/$1 [L]

In der ersten Zeile wird die Funktion zum Umschreiben von URLs im Apache Webserver aktiviert. In der zweiten Zeile wird die Bedingung definiert "Wenn der Aufruf nicht auf Port 443 erfolgt" (Port 443 wird für SSL-Verschlüsselung verwendet, Port 80 für unverschlüsselte Aufrufe). Zeile 3 ist die Regel für das Umschreiben der URL. Wenn die Bedingung aus Zeile 2 zutrifft, werden die Aufrufe einer beliebigen Seite auf die gleiche Domain (${HTTP_HOST}) jedoch über das https:// Protokoll umgeleitet. Mit /$1 wird die ursprüngliche URL (z.B. impressum.html) an den Domainnamen angefügt. Mit dem Parameter [L] wird angegeben, dass das Umschreiben der URLs hier enden soll, weitere Zeilen in der .htaccess Datei werden also ignoriert.

Domain name-of-domain.net nach name-der-domain.de umleiten

Oftmals werden für ein Projekt mehrere Domains registriert, um verschiedene Schreibweisen abzudecken. Nach außen wird eine Hauptdomain kommunziert (Beispiel: name-der-domain.de als Hautpdomain, dazu name-of-domain.net als Zusatzdomains). 

Mit folgendem Eintrag in der .htaccess Datei werden alle Aufrufe für name-of-domain.net nach name-der-domain.de weitergeleitet:

...
RewriteCond %{HTTP_HOST} ^(www\.)?name-of-domain\.net$ [NC]
RewriteRule ^(.*)$ http://www.name-der-domain.de/$1 [R=301,L]

Die Weiterleitung nach name-der-domain.de erfolgt dabei mit dem Statuscode 301 (permanent), so dass auch in Suchmaschinen auf Dauer nur diese erscheint. Dadurch werden Probleme mit "doppeltem Inhalt" (Duplicate Content) vermieden. Alle bei der ursprünglichen Domain übermittelten Parameter werden an die Zieldomain weitergegeben.

Einer Domain immer www. voranstellen

Mit folgendem Eintrag in der .htaccess Datei werden alle Aufrufe für eine Domain ohne www auf die Variante mit www weitergeleitet:

...
RewriteCond %{HTTP_HOST} ^name-der-domain\.de$ [NC]
RewriteRule ^(.*)$ http://www.name-der-domain.de/$1 [R=301,L]

Die Weiterleitung nach www.name-der-domain.de erfolgt dabei mit dem Statuscode 301 (permanent), so dass auch in Suchmaschinen auf Dauer nur diese erscheint.

Domain auf eine Seite leiten

Bestimmte Domains oder Subdomains sollen entweder mit oder ohne www auf eine bestimmte Unterseite weitergeleitet werden.

Dazu fügen Sie folgende Zeilen in Ihre .htaccess ein:

#ohne realurl: 
...
RewriteCond %{HTTP_HOST} ^(www\.)?name-der-domain\.de
RewriteRule ^$ /index.php?id=85

#oder realurl/simulatestatic mit html Suffix:
...
RewriteCond %{HTTP_HOST} ^(www\.)?name-der-domain\.de
RewriteRule ^$ /unterseite.html

#oder realurl ohne html Suffix:
...
RewriteCond %{HTTP_HOST} ^(www\.)?name-der-domain\.de
RewriteRule ^$ /unterseite/

Weiterleitung auf eine andere Domain zu einer Unterseite

...
RewriteCond %{HTTP_HOST} ^(www\.)?name-of-domain\.net [NC]
RewriteRule ^(.*)$ http://www.name-der-domain.de/unterseite.hmtl [R=301,L]

Redirect mit ? in der URL

http://www.domainname.de/index.php?id=7

soll nach

http://www.domainname.de/impressum.html

umgeleitet werden. Das Problem ist das ? in der alten URL und muss per QUERY_STRING in der Condition abgefragt werden.
Lösung:

...
RewriteCond %{QUERY_STRING} ^id=7$
RewriteRule ^.*$ http://www.domainname.de/impressum.html? [L,R=301]

Wichtig ist auch der Browser-Cache. Der sollte unbedingt geleert werden, denn wenn ein Aufruf noch im Cache drin ist kann dadurch u.U. immer auf die falsche Seite leiten.

So verhindert man, dass alte durch einen Umzug oder Neuprogrammierung nicht mehr vorhandene URLs in den Suchmaschinen zu einem schlechteren Ranking führen.

Directory Listing

Soll über einer geschützen Unterseite (z.B. fileadmin/downloads) des Internetauftritts ein Directory Listing realisiert werden, dann sollte die .htaccess wie folgt eingestellt werden:

AuthType Basic
AuthName "system - "
Options +Indexes
IndexOptions +FancyIndexing
AuthUserFile /*ihr_serverpfad/projektpfad/filadmin/downloads/.htpasswd
AuthGroupFile /dev/null
require valid-user

* ihr_serverpfad  finden Sie in Ihrem Kundenmenu unter Technische Infos oder durch Eingabe des Befehls $PWD in der Shell.

Den User mit verschlüseltem Passwort in dem Fall in der .htpasswd vorhanden sein.

Die Unterseite mit dem Directory Listing muss von der TYPO3 index.php ausgeschlossen werden und erreichen Sie über die .htaccess in dem Projektverzeichnis mit folgenden Angaben nach der RewriteEngine On:

RewriteRule ^fileadmin/downloads/$ - [L]
RewriteRule ^fileadmin/downloads/.*$ - [L]

Bestimmten IP Adressen sperren

Manchmal ist es notwendig, bestimmte IP Adressen vom Aufruf der Webseite auszusperren, z.B. bei einem Angriffsversuch auf die Webseite. Über folgenden Eintrag in der .htaccess Datei (z.B. vor dem Eintrag 'RewriteEngine On') im Startverzeichnis der Seite lassen sich unerwünschte Besucher abweisen:

order allow,deny 
deny from 192.168.2.17
deny from 10.10.20.63
allow from all

Bei mehreren IP Adressen wird jede in eine eigene Zeile eingetragen. Die Einstellung gilt auch für alle Unterverzeichnisse. Wenn jemand mit einer gesperrten Adresse versucht, die Seite aufzurufen, erhält er einen 403 Fehlercode.

HTML5 Videos zulassen

Falls es in einzelnen Browsern zu Problemen beim Abspielen von per HTML5 eingebundenen Videos kommt, helfen eventuell folgende Zeilen in der .htaccess Datei im Projektverzeichnis:

AddType video/ogg .ogm 
AddType video/ogg .ogv
AddType video/ogg .ogg
AddType video/webm .webm
AddType audio/webm .weba
AddType video/mp4 .mp4
AddType video/x-m4v .m4v

Passwort geschützter Bereich

Wenn man einen Bereich schaffen möchte der nicht für die Öffentlichkeit zugänglich ist, für zum Beispiel eine Test-Installation ("test.meinedomain.de") seiner eigenen Webseite oder einen Mitarbeiter-Download Bereich mit den Bildern der Weihnachtsfeier ("test.meinedomain.de/downloads/weihnachtsfeier2015/"), wird nicht viel benötigt.

Nach dem der Verzeichnisschutz eingerichtet wurde, kann auf den geschützten Bereich von außen nur noch mit Benutzer und Passwort zugegriffen werden.

.htaccess und .htpasswd Dateien erstellen

Um die Dateien zu erstellen verbindet man sich per SSH auf den Webspace.
Dann mit "cd" bzw. mit "mc" in das zu schützende Verzeichnis wechseln (z.B.: "cd typo3cms/projekt1/").
Dabei ist zu beachten, dass im Verzeichnis bereits eine ".htaccess" Datei existieren kann! Mit dem Unix-Befehl

ls -lah .ht*

kann dies nachgeprüft werden. Wenn dort schon eine ".htaccess" Datei existiert müssen die Anpassungen in dieser ergänzt werden. Die zusätzlichen Zeilen Code müssen am Anfang der Datei gemacht werden (vor den Rewirtes!), sonst greifen die Einstellungen evtl. nicht korrekt!

".htaccess" Inhalt

AuthType Basic
AuthName "Bitte melden Sie sich an"
AuthUserFile /kompletter/server/pfad/zu/dem/verzeichnis/.htpasswd
require valid-user

Wichtig: mit dem Shell Befehl pwd kann man sich den kompletten Server-Pfad ausgeben lassen, denn die .htpasswd wird nur so gefunden. Ersetzen Sie im oberen Code "/kompletter/server/pfad/..." duch die Ausgabe des Befehls pwd.

Um die .htpasswd Datei zu erstellen gibt es mehrere Möglichkeiten zum Beispiel Online-Generatoren, doch halten wir diese für kritisch. Man ist gezwungen seinen Benutzername und Kennwort in ein Fremdes Formular ein zugeben und weiß nicht, was mit seinen Daten in Wirklichkeit passiert.

Deswegen empfehlen wir die folgende Vorgehensweise, mit dem Unix Befehl htpasswd kann man dies einfach erledigen. Ein Beispielhafter Aufruf würde dann so ausschauen:

htpasswd -cm ./.htpasswd benutzername

Anschließend wird man aufgefordert ein Password inkl. Wiederholung einzugeben. Wenn danach weitere User hinzugefügt werden, darf auf keinen Fall die Option "-c" (create new file / Neue Datei erstellen) gesetzt sein, sonst wird die Datei ohne Nachfrage überschrieben. Das "-m" bedeutet dass, das Passwort mit MD5 verschlüsselt in der Datei geschrieben wird.

htpasswd -m ./.htpasswd weitererbenutzer

Um zu Testen ob alles erfolgreich war, braucht man einfach nur die geschütze URL im Browser aufrufen. Wenn dort eine Dialogbox zum Einloggen angezeigt wird und der Login funktioniert ist der Schutz schon eingerichtet. Falls ein "Server Error 500" Ausgegeben wird, ist dies mit sehr großer Wahrscheinlichkeit auf einen Syntax Fehler in der .htaccess bzw. .htpasswd zurück zu führen.