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 gebräuchlichsten 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 Unterverzeichnissen 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, die Syntax, 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, da diese Fehler auch nicht protokolliert werden.
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 darauf achten, dass diese Zeile nur ein Mal in der .htaccess vorhanden sein darf):
RewriteEngine On
Die Parameter: 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. So wird auch in Suchmaschinen auf Dauer nur diese angezeigt.
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, wenn diese Regel zutrifft. Hierzu ein Beispiel:
RewriteRule ^neues\.html$ /aktuelles.html [R=301,L]
Damit wird die Seite domain.tld/neues.html dauerhaft auf domain.tld/aktuelles.html weitergeleitet.
Die Schreibweise der Rewrite Regeln basiert dabei auf "Regulären Ausdrücken" (Regular Expressions, regex).
Mit den Zeichen ^ und $ wird der Anfang und das 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).
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 [R=301,L]
In der ersten 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 2 ist die Regel für das Umschreiben der URL. Wenn die Bedingung aus Zeile 1 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.
Durch den Parameter R=301 erfolgt dabei die Umleitung mit dem Statuscode 301 (permanent), so dass auch in Suchmaschinen auf Dauer nur diese erscheint.
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]
Bei einer Domain immer www. entfernen
Mit folgendem Eintrag in der .htaccess Datei werden alle Aufrufe für eine Domain mit www auf die Variante ohne www weitergeleitet:
RewriteCond %{HTTP_HOST} ^www\.name-der-domain\.de$ [NC]
RewriteRule ^(.*)$ http://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.
Für die Weiterleitung einer beliebigen Subdomain, schreibt man folgendes:
RewriteCond %{HTTP_HOST} ^www\.(.*)\.name-der-domain\.de$ [NC]
RewriteRule ^(.*)$ http://%1.name-der-domain.de/$1 [R=301,L]
Bei 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 name-of-domain.net nach name-der-domain.de mit Parameter umleiten
Oftmals werden für ein Projekt mehrere Domains registriert, um verschiedene Schreibweisen abzudecken. Nach außen wird nur eine Hauptdomain kommunziert (Beispiel: name-der-domain.de als Hautpdomain, dazu name-of-domain.net als Zusatzdomain).
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 ^(.*)$ https://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.
Domain name-of-domain.net nach name-der-domain.de ohne Parameter umleiten
Soll die Domainweiterleitung ohne Übergabe der Parameter erfolgen, lautet der Eintrag in der .htaccess Datei folgendermaßen:
RewriteCond %{HTTP_HOST} ^(www\.)?name-of-domain\.net
RewriteRule ^(.*)$ https://name-der-domain.de/ [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 nicht an die Zieldomain weitergegeben.
Domain auf eine Unterseite 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:
# mit realurl/simulatestatic und .html Suffix:
RewriteCond %{HTTP_HOST} ^(www\.)?name-der-domain\.de
RewriteRule ^$ /unterseite.html
# mit realurl ohne .html Suffix:
RewriteCond %{HTTP_HOST} ^(www\.)?name-der-domain\.de
RewriteRule ^$ /unterseite/
#ohne realurl:
RewriteCond %{HTTP_HOST} ^(www\.)?name-der-domain\.de
RewriteRule ^$ /index.php?id=85
Domain auf eine Unterseite einer anderen Domain leiten
RewriteCond %{HTTP_HOST} ^(www\.)?name-of-domain\.net [NC]
RewriteRule ^(.*)$ https://name-der-domain.de/unterseite.html [R=301,L]
Parameter aus der URL entfernen
Manchmal möchte man einen Parameter aus einer URL entfernen, z.B. wenn es von einer ursprünglich mehrsprachigen Seite nur noch die Standardsprache gibt. Wenn Google dann eine Seite wie jweiland.net/index.php?id=289&L=1 aufruft, kann man die URL umleiten zu jweiland.net/index.php?id=289. Das lässst sich mit folgendem Eintrag in der .htaccess Datei erreichen:
RewriteCond %{QUERY_STRING} ^(.+?&|)L=[^&]*(?:&(.*)|)$ [NC]
RewriteRule ^ %{REQUEST_URI}?%1%2 [R=301,L]
Der zu entfernende Parameter (hier L=) wird muss in der ersten Zeile angepasst werden.
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. Dieses muss per QUERY_STRING in der Condition abgefragt werden.
Lösung:
RewriteCond %{QUERY_STRING} ^id=7$
RewriteRule ^.*$ https://name-der-domain.de/impressum.html? [R=301,L]
Wichtig ist auch der Browser-Cache. Dieser sollte unbedingt geleert werden, denn wenn ein Aufruf noch im Cache vorhanden ist kommt man dadurch unter Umständen weiterhin auf die falsche Seite.
So verhindert man, dass alte, durch einen Umzug oder Neuprogrammierung, nicht mehr vorhandene URLs in den Suchmaschinen zu einem schlechteren Ranking führen.
Beste Performance und perfekter Service für das Hosting ihrer Webseite. Alle Webhosting Tarife mit 100% SSD. Serverstandort Deutschland.
Informieren Sie sich hier über unsere Angebote.
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 muss 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]
Bestimmte IP Adressen sperren
Manchmal ist es notwendig, z.B. bei einem Angriffsversuch auf die Webseite, bestimmte IP-Adressen vom Aufruf der Webseite auszusperren. Über den folgenden Eintrag in der .htaccess Datei (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 ist auch für alle Unterverzeichnisse gültig. Versucht jemand mit einer gesperrten Adresse die Seite aufzurufen erhält er dadurch einen 403 Fehlercode (Zugriff verweigert).
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.
Nachdem der Verzeichnisschutz eingerichtet wurde, kann auf den geschützten Bereich von außen nur noch mit einem Benutzernamen 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 geprü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 bzw. vor eventuell vorhandenen Rewrite Regeln, andernfalls greifen die Einstellungen nicht korrekt!
Inhalt der .htaccess
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/zu/dem/verzeichnis/ durch 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 einzugeben und weiß nicht, was mit seinen Daten in Wirklichkeit passiert.
Aus diesem Grund empfehlen wir die folgende Vorgehensweise:
Mit dem Unix Befehl htpasswd kann man dies einfach erledigen. Ein exemplarischer 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 die Datei geschrieben wird.
htpasswd -m ./.htpasswd weitererbenutzername
Um zu Testen ob alles erfolgreich war, braucht man einfach nur die geschützte 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ückzuführen.