Wenn wir über htaccess sprechen, ist im Detail die htaccess-Datei gemeint. Diese Datei enthält Steuerinformationen, wie ein Webserver arbeiten soll, während eine Website an Besucher:innen ausgeliefert wird.
Die Datei wirst Du wahrscheinlich schon auf Deinem Webspace finden, zu finden im selben Ordner wie die Dateien Deiner Website.
Dabei ist htaccess nicht an ein bestimmtes CMS oder Shopsystem gebunden. Egal, ob Du WordPress, Prestashop oder eine selbst programmierte Website betreibst, htaccess ist davon unabhängig.
Die meisten CMS und Shopsysteme benutzen im Hintergrund bereits htaccess, ohne dass Du dafür extra etwas einstellen musst.
Falls das für Dich zutrifft, lohnt es sich trotzdem, das Thema zu prüfen und eventuelle Lücken aufzufüllen.
Es kann für jede Website benutzt werden, solange diese auf einem Apache Webserver läuft. Die Datei selbst ist dabei einfach eine Textdatei. Zur Bearbeitung ist also nicht weiter nötig als ein einfacher Texteditor.
Mit der .htaccess-Datei können viele verschiedene Einstellungen des Webservers überschrieben werden. In diesem Artikel beschränken wir uns dabei auf einige für SEO und Sicherheit wichtige Einstellungen.
Signale an die Suchmaschine
Neben Inhalten und Meta-Daten verarbeiten Suchmaschinen auch technische Signale einer Website. Diese beeinflussen, ob und wie eine Seite in den Index aufgenommen wird. Darüber hinaus kannst Du auch den existierenden Suchmaschinen-Index beeinflussen.
Im Detail sind hier die http-Status-Codes gemeint, wie z.B. der Code 301 Redirect. Umleitungen bzw. Redirects sind ein nützliches Werkzeug, wenn auf einer bereits indexierten Seite Änderungen vorgenommen werden.
Ein gängiges Beispiel dafür ist der Umzug einer ganzen Website auf eine neue Domain, aber auch Änderungen in der URL-Struktur innerhalb derselben Domain. Umleitungen wurden schon im Artikel von Markus Fritzsche zu Redirects beleuchtet. Daher geht es mit dem etwas unbekannteren Status Code 410 weiter.
Es kann manchmal vorkommen, dass Du eine Seite komplett aus dem Suchmaschinen-Index streichen möchtest. Dann kannst Du den Status Code 410 – Gone zur Anwendung bringen. Dieser Status Code informiert die Suchmaschine über die dauerhafte Entfernung der betroffenen URL.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^alte-seite/ – [L,R=410]
</IfModule>
Der Code 410 signalisiert der Suchmaschine, dass eine Seite endgültig entfernt wurde und so schnell wie möglich aus dem Index entfernt werden soll. Dabei unterscheidet sich im Signal an Suchmaschinen grundlegend vom bekannteren Code 404. 404 beschreibt, dass eine Seite temporär nicht verfügbar ist. Der Suchmaschinen-Crawler wird das auch als solches behandeln und eine Zeit lang prüfen, ob die Seite wieder verfügbar ist. Erst nachdem eine gewisse Zeit vergangen ist, wird die Seite aus dem Index entfernt.
Die Möglichkeit, die Indexierung von bestimmten Unterseiten zu verhindern, ist über den Robots-Meta-Tag gegeben. Der Meta-Tag ist leider nur für html-Seiten nutzbar, daher ist er für andere Arten von Dateien nicht geeignet.
An der Stelle springt der X-Robots-Tag Header ein. Ähnlich wie mit dem Meta-Tag kann die Indexierung der Seite unterbunden werden, die den Wert noindex mitliefert.
Der Unterschied ist hier, dass der Wert im http-Header mitgeschickt wird und daher auch für beliebige Dateien wie Bilder und PDFs verwendet werden kann. Da die Funktion auch mit URL-Mustern arbeitet, kann sie ebenso für ganze Sektionen einer Website angewandt werden. (Quelle: Google Developers Documentation)
<Files ~ “\.(pdf)$”>
Header set X-Robots-Tag “noindex”
</Files>
Der oben stehende Code setzt diesen Header für alle PDF-Dateien. Das ist nützlich, um zu verhindern, dass Besucher:innen ein PDF direkt über Google herunterladen und so die Landingpage einfach umgehen.
Fehlerseiten
Die von Webservern standardmäßig mitgelieferten Fehlerseiten sind im besten Fall schmucklos und im schlimmsten Fall verwirrend. Auch hier können htaccess-Einstellungen Abhilfe schaffen.
Du kannst explizit festlegen, welche Seiten angezeigt werden sollen, wenn ein Fehler auftritt.
Hier ein Beispiel für diese Einstellung:
ErrorDocument 403 /zugriff-verweigert.html
ErrorDocument 404 /nicht-gefunden.html
ErrorDocument 500 /server-fehler.html
Die Zahl entspricht dabei dem http-Fehlertyp:
- 403: der Zugriff auf die Seite wurde verweigert
- 404: die gewünschte Seite wurde nicht gefunden
- 500: es gab einen Serverfehler
Hinter der Fehlerzahl folgt die URL, unter der die Fehlerseite erreichbar ist. Damit kannst Du Deinen Besucher:innen im Fehlerfall eine gestylte und nützliche Fehlerseite anzeigen. Auf der „404 Nicht gefunden“ Fehlerseite bieten sich zum Beispiel ein Suchfeld oder eine Liste mit den neuesten Blog-Artikeln an.
Auf die Art ist die Fehlerseite für Deine Besucher:innen nützlich und verhindert vielleicht einen Absprung. Bei anderen Fehlertypen können Verlinkungen oder alternative Kontaktmöglichkeiten sinnvoll sein, um Besuchern und Besucherinnen trotz des aufgetretenen Fehlers zu ermöglichen, ihr Anliegen voranzubringen.
Redirects
Eine der mächtigsten Funktionen in htaccess-Dateien ist das Umschreiben von URLs. Mit dem Rewrite-Modul können sowohl interne URL-Umschreibungen, als auch Weiterleitungen eingestellt werden.
Legen wir mit den Umschreibungen los. Manchmal tauchen auf einer Website unschöne URLs auf, die zwar technisch funktionieren, aber nicht so ansprechend aussehen. Zum Beispiel diese URL eines Blogarchivs, die die Kategorie auf Seite 2 zeigt.
meine-website.de/blog?kategorie=technik&seite=2
Viel schöner wäre es, wenn die URL stattdessen so aussehen würde:
meine-website.de/blog/kategorie/technik/2
Mit dem unten stehenden Code in der htaccess-Datei kannst Du diesen Effekt erreichen. Das Schlüsselwort RewriteRule zeigt dabei an, dass in dieser Zeile eine vollständige Umschreibe-Regel folgt.
Der Teil ^blog/kategorie/ grenzt die Umschreibung auf den Blog mit Angabe einer Kategorie ein. Das ist wichtig, sonst würden unter Umständen noch mehr Seiten ungewollt auf den Blog umleiten.
In die Angaben in Klammern sind Platzhalter, die später wieder in die URL eingefügt werden. Das ist im zweiten Teil zu sehen.
Die umgeschriebene URL startet mit dem festen Anteil /blog?kategorie= und nimmt dann die Platzhalter entgegen. Die Platzhalter sind einfach in der Reihenfolge, in der sie gefunden wurden, durchnummeriert.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^blog/kategorie/(.+)/([0-9]+)?$ /blog?kategorie=$1&seite=$2 [L]
</IfModule>
Zum Testen Deiner Rewrite-Kreation musst Du zum Glück nicht Deine Website auf’s Spiel setzen. Es gibt unter htaccess.madewithlove.com ein hervorragendes Test-Tool, mit der die Einstellungen geprüft werden können.
Denke beim Testen daran, auch andere URLs, die nicht umgeschrieben werden sollen, zu prüfen! Es kann sonst vorkommen, dass eine Umschreibung zu weit greift und mehr umschreibt, als eigentlich beabsichtigt ist.
Weiter oben wurden Redirects in Bezug auf die Status Codes schon einmal erwähnt. Nun schauen wir uns an, wie wir die Weiterleitung einrichten können.
Weiterleitungen über die Rewrite Rules sind mächtige Werkzeuge, da sie ebenfalls mit Platzhaltern und Mustern arbeiten können.
Bleiben wir als Beispiel bei einem Blog. Nehmen wir an, dass der Blog von Deiner alten Website alte-website.de/blog/ auf eine eigene Domain umgezogen werden: dein-neuer-blog.de.
Der technische Umzug ist geglückt, aber die alten URLs sind bei Google indexiert und ranken gut. Bei einem Umzug würde das Ranking ohne Weiterleitung verloren gehen. RewriteRules zur Rettung! Diesen Code kannst Du in der .htaccess-Datei auf alte-website.de einfügen:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^blog/(.*)?$ https://dein-neuer-blog.de/$1 [R=301,L]
</IfModule>
Nach dem ersten Beispiel sieht der Code schon recht vertraut aus. Wie zuvor gibt RewriteRule an, dass ein Umschreibebefehl folgt. Interessant ist der zweite und dritte Teil des Befehls.
Das Ziel ist hier mit einer expliziten Domain angegeben. Damit wird die Ziel-URL auf diese Domain weitergeleitet.
Mit dem dritten Teil [R=301,L] wird definiert, dass es sich um eine tatsächliche Weiterleitung handelt. Besucher:innen und Suchmaschinen-Crawler werden gleichermaßen mittels Redirect 301 auf die neue Adresse weitergeleitet.
Dadurch wird die alte URL aus dem Suchmaschinen-Index verschwinden und stattdessen die neue aufgenommen. Und da wir hier mit Platzhaltern gearbeitet haben, gilt diese Weiterleitung für alle Beiträge im Blog!
Sollten die Anforderungen, wann eine Weiterleitung erfolgt, mal etwas komplizierter sein, kannst Du das Ganze mit Bedingungen anreichern, mit der sogenannten RewriteCond.
Dabei wird die RewriteCond direkt über die RewriteRule geschrieben. Hier ein Beispiel:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.deine-website\.de$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)?$ https://www.deine-website.de/$1 [R=301,L]
</IfModule>
Im Beispiel werden drei RewriteCond angewandt. Damit die RewriteRule gültig ist, müssen alle RewriteConds zutreffen. Die Bedingungen sind der Reihe nach: wenn die eingeforderte URL nicht mit www.deine-website.de beginnt, kein Verzeichnis ist und keine Datei ist.
Das Ergebnis ist, dass alle Anfragen, die nicht direkt auf eine Datei oder ein Verzeichnis zielen, auf die Domain www.deine-website.de weitergeleitet werden.
Pagespeed Optimierungen
Über die htaccess-Datei können technische Optimierungen angewandt werden, die Deine Website schneller machen – sowohl für Besucher:innen, als auch für die Suchmaschine.
Textkomprimierung hilft, die zu übertragende Datenmenge zu verkleinern und so zu besseren Seiten-Ladezeiten beizutragen.
Das ist besonders für Besucher:innen mit geringerer Internetgeschwindigkeit wichtig. Die folgenden Zeilen sorgen dabei dafür, dass viele gängigen Dateitypen komprimiert werden.
<IfModule mod_deflate.c>
AddType x-font/woff .woff
AddType x-font/ttf .ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE x-font/ttf
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE font/opentype font/ttf font/eot font/otf
</IfModule>
Mit Caching-Headern wird die Geschwindigkeit Deiner Seite ebenfalls verbessert. Dabei wird vom Webserver festgelegt, wie lange eine Datei vom Browser des Besuchers oder der Besucherin zwischengespeichert werden soll.
Zwischengespeicherte Dateien müssen nicht noch einmal geladen werden und sind dementsprechend schnell verfügbar.
Caching-Header für WordPress wurden von Daniel Voelskow bereits in einem Artikel erläutert. Solltest Du WordPress mal nicht zur Hand haben, kannst Du die Caching Einstellungen auch manuell vornehmen.
<IfModule mod_expires.c>
AddType application/font-woff2 .woff2
AddType application/x-font-opentype .otf
ExpiresActive On
ExpiresDefault A0
ExpiresByType video/webm A10368000
ExpiresByType video/ogg A10368000
ExpiresByType video/mp4 A10368000
ExpiresByType image/avif A10368000
ExpiresByType image/webp A10368000
ExpiresByType image/gif A10368000
ExpiresByType image/png A10368000
ExpiresByType image/jpg A10368000
ExpiresByType image/jpeg A10368000
ExpiresByType image/ico A10368000
ExpiresByType image/svg+xml A10368000
ExpiresByType text/css A10368000
ExpiresByType text/javascript A10368000
ExpiresByType application/javascript A10368000
ExpiresByType application/x-javascript A10368000
ExpiresByType application/font-woff2 A10368000
ExpiresByType application/x-font-opentype A10368000
ExpiresByType application/x-font-truetype A10368000
</IfModule>
Sicherheit
Auch sicherheitsrelevante Einstellungen sind zu empfehlen. Zum Beispiel die Nutzung von HSTS – HTTP Strict Transport Security. Diese Einstellung garantiert, dass die Website nur mit https besucht werden darf.
https zu nutzen ist inzwischen der Standard. Die grundlegende Weiterleitung auf https per htaccess wurde hier auf OMT bereits in einem Artikel zur DSGVO beschrieben.
Es gibt, während der dort erklärten Weiterleitung von http auf https, noch eine kleine Lücke, die von Hackern ausgenutzt werden kann. Mit einer einzigen Zeile kannst Du HSTS auf Deiner Website aktivieren und diese Lücke schließen:
<IfModule mod_headers.c>
Header Set Strict-Transport-Security “max-age=31536000; includeSubDomains”
</IfModule>
Die Verwendung von HSTS wird zwar von Suchmaschinen nicht beachtet. Es ist für die Sicherheit und den Datenschutz der Besucher:innen trotzdem eine gute Idee.
Zugriffsschutz
Eine Erwähnung ist auch der htaccess-Zugriffssschutz wert. Es ist möglich den Zugriff auf eine ganze Website einzuschränken.
Dabei kann sowohl ein einfacher Passwortschutz eingerichtet als auch, der Zugriff auf bestimmte IP-Adressen eingeschränkt werden. Zuerst das Beispiel für den Login.
AuthType Basic
AuthName “Login zur Website”
AuthUserFile /<ihr-absoluter-pfad-zum-verzeichnis>/.htpasswd
Require valid-user
Dieser Code-Block legt einen einfachen Login fest. Dabei meint „AuthType Basic“, dass es sich um einen einfachen, vorgeschalteten Passwortschutz handelt.
Mit der Einstellung „AuthName“ wird die Beschriftung festgelegt, die Besucher:innen im Anmeldefenster zu sehen bekommen. „AuthUserFile“ definiert in welchem Verzeichnis die Passwortdatei zu finden ist.
Achtung! Das muss der absolute Server-Pfad zur .htpasswd-Datei sein. Den Server-Pfad findest Du in der Regel im Hosting-Bereich. Die .htpasswd-Konfigurationsdatei muss nicht im selben Verzeichnis oder Unterverzeichnis liegen wie die .htaccess Datei.
Nun zur IP-basierten Sicherung. Mit dieser Anweisung wird der Zugriff auf Besucher:innen mit der IP-Adresse 11.22.33.44 oder 55.66.77.88 beschränkt. Das ist sehr nützlich, wenn beispielsweise nur Mitarbeiter:innen aus dem eigenen Büronetzwerk oder ausgewählte Kunden auf eine Vorschauseite Zugriff erhalten sollen.
<IfModule mod_authz_core.c>
<RequireAny>
Require ip 11.22.33.44
Require ip 55.66.77.88
</RequireAny>
</IfModule>
Tools
Die Bearbeitung von htaccess-Dateien kann manchmal schwierig sein. Wenn sich ein Tippfehler einschleicht, ist es nicht einfach den zu finden, da Fehler nicht ausgegeben werden.
Du siehst nur eine funktionierende Seite, wenn alles gut ist und einen Serverfehler, wenn etwas nicht stimmt.
Um das Schreiben von .htaccess-Dateien zu vereinfachen gibt es verschiedene Tools. Diese erlauben es den Code vorher zu testen und damit Kopfschmerzen zu vermeiden.
Htaccess Rewrite-Rules Checker
https://htaccess.madewithlove.com/
Mit diesem Tool können die Rewrite-Rules inhaltlich getestet werden. Es ist möglich eine Quell-URL testen zu lassen und in Echtzeit zu sehen welches Ergebnis erzielt wird.
Htaccess Syntax Checker
http://www.htaccesscheck.com/index.html
Dieser Checker prüft nur die Syntax der htaccess-Datei. Es wird also geprüft, dass alle Befehle richtig geschrieben sind und keine Tipp- und Formatierungsfehler existieren. Ob die Befehle inhaltlich richtig sind, kann der Checker nicht prüfen.
Obwohl diese Tools eine große Hilfe sind, ist das Ergebnis auf dem richtigen Webserver das Maß der Dinge.
Es ist dringend zu empfehlen, die fertige htaccess-Datei noch einmal auf einem richtigen Webserver zu prüfen.
Vor der Bearbeitung ein Backup anzufertigen, versteht sich von selbst – das beste Sicherheitsnetz ist es weiterhin, die alte Version einfach wiederherstellen zu können.
Drei Quick Wins
Aus all den vorgestellten Funktionen, die htaccess zu bieten hat, gibt es ein paar Quick Wins. Die sollten immer zur Anwendung kommen, wenn es keinen triftigen Grund dagegen gibt:
- Textkomprimierung aktivieren
Hilft den Ladezeiten Deiner Seite und freut Suchmaschine und Besucher:innen gleichermaßen. - Caching Header setzen
Beschleunigt die Ladezeiten für wiederkehrende Besucher:innen. - HSTS-Header setzen
Verbessert die Sicherheit Deiner Seite nach Empfehlungen des BSI.
Diese Maßnahmen sind schnell in die htaccess-Datei eingefügt und bieten Vorteile für Geschwindigkeit und Sicherheit.
Sieben Praxistipps
- So nützlich htaccess auch ist, bedarf es trotz allem einem gewissen Aufwand und Einarbeitung um gewünschte Ziele zu erreichen. Zum Glück gibt es viele Plugins und Erweiterungen für gängige CMS, die helfen Ziele wie die oben genannten Quick Wins zu erreichen, ohne die Konfigurationsdatei manuell anzupassen.
- Von Haus aus wird htaccess nur vom Webserver Apache unterstützt. Apache ist weitverbreitet, aber nicht der einzige Webserver auf dem Markt. Fall Du nicht sicher bist, welchen Webserver Du nutzt, kann Dir Dein Hoster oder Web-Admin weiterhelfen.
- Apache-Versionen können unterschiedlich sein. Die zwei gängigsten Apache-Versionen sind 2.2 und 2.4. Die meisten htaccess-Befehle funktionieren für beide Versionen, aber es gibt Unterschiede. Das muss vorher beachtet werden, denn Fehler führen auch hier nur zu einer leeren Fehlerseite.
- Die Benennung der „.htaccess“ Datei ist wichtig. Der führende Punkt muss im Dateinamen vorhanden sein. Es darf außerdem keine weitere Dateiendung wie .txt vorhanden sein.
- htaccess-Dateien gelten immer für das Verzeichnis und alle Unterverzeichnisse, in dem sie gespeichert ist. Weitere htaccess-Dateien in Unterverzeichnissen überschreiben die Datei im darüber liegenden Verzeichnis.
- Backups anfertigen! Durch die Eigenschaft von .htaccess-Dateien, bei Fehlern einfach einen Serverfehler zu verursachen, kann die Bearbeitung eine heikle Sache sein. Im Ernstfall ist die ganze Website nicht mehr erreichbar. Die htaccess-Datei zu kopieren und schnell wiederherstellen zu können, ist ein Muss.
- Befehle können durch Kommentarzeichen deaktiviert werden. Wenn Du einer Zeile in der .htaccess-Datei einen hashtag # voranstellst, gilt diese Zeile als Kommentar und wird vom Webserver ignoriert. Damit kannst Du neben echten Kommentaren auch Code-Schnipsel in der htaccess-Datei zwischenspeichern oder kurzzeitig deaktivieren.