htaccess – Grundlagen & Beispiele

Irgendwann im Laufe deiner Website-Bearbeitung wirst du Bekanntschaft mit der htaccess Datei machen. Davon bin ich überzeugt und das nicht nur, weil du die Content Security Policy (CSP) einstellst. Ich werde dir die gängigsten .htaccess Themen zusammenfassen und jeweils den Wunsch sowie das Ziel angeben.

Insbesondere im Zusammenhang mit bedingten Weiterleitungen verwende ich die htaccess-Datei gern, obwohl mit Redirection auch ein adäquates Plugin existiert.

Zunächst handeln wir in aller Kürze die Theorie ab: Wozu also dient eine .htaccess Konfigurationsdatei? Die Datei beinhaltet Anweisungen zur Konfiguration für den Server, verschiedene Regeln sind hinterlegt. Beispielsweise speichert WordPress Anweisungen in der .htaccess, die für die Ausgabe der URL-Struktur zuständig sind. Der Webserver erfährt, wie er die Verzeichnisstruktur ausgeben soll. Weiter kannst du Einstellungen vornehmen, die der Sicherheit deiner Website zuträglich sind und für eine zügigere Ladezeit gibt es ebenfalls Einträge in der .htaccess Datei.

So bearbeitest du deine htaccess

Erster Schritt: Backup anlegen!

Sobald du tiefgreifende Änderungen am Server oder deiner Website vornimmst, legst du ein Backup an! Bei der .htaccess Datei ist dies von elementarer Bedeutung, denn sobald in dieser Datei ein Fehler vorhanden ist, funktioniert deine Seite nicht mehr! Bevor du voller Panik unkontrollierte Änderungen vornimmst, tauschst du die bearbeitete Datei gegen deine Sicherheitskopie aus.

Regeln kommentieren

Dir oder anderen Nutzern hilft es ungemein, wenn du die eingefügten Konfigurationsanweisungen kommentierst. Hierzu fügst du über dem jeweiligen Code eine Zeile samt führendem Hastag ein.

# Mein Kommentar zum Code

In den folgenden Beispielcodes ist diese Zeile bereits enthalten, damit du den Überblick behältst.

Ich sehe keine .htaccess-Datei in meinem FTP-Programm

Die .htaccess-Datei muss nicht auf dem Webserver liegen. Wenn du die Datei nicht siehst, ist eventuell keine vorhanden. Andernfalls blendet dein FTP-Programm die Datei auf dem Server aus, da sie mit einem Punkt startet. Beides lässt sich simpel lösen:

Bedenke: Nur Webserver die NCSA kompatibel sind, kennen das Konzept der .htaccess Datei. Der Vorteil dabei, die am weitesten verbreitete Variante des Apache Webservers ist kompatibel.

Erzwinge die Anzeige von „versteckten Dateien“ in deinem FTP-Programm. Meist findet sich eine solche Option in den Einstellungen.

  • FileZilla: Menü unter „Server“
  • WinSCP: Menü unter „Einstellungen“ –> Listenfenster –> Versteckte Dateien anzeigen (Strg+Alt+H)

Ist keine .htaccess vorhanden, erzeugst du eine Textdatei (txt) und benennst diese passend. Du kannst auch eine leere Text-Datei hochladen und auf dem Server umbenennen. Vereinzelt kann es passieren, dass bestimmte Benutzerrechte vergeben werden müssen. Dies umgehst du, wenn du die Datei direkt auf dem Webserver erzeugst.

Die Datei bearbeiten

Schnapp dir einen Texteditor deiner Wahl und nimm Änderungen an der Datei vor.

  • Komfortabler als der Standard-Editor ist unter Windows: Notepad++
  • Auf dem Mac kannst du die Datei mit Textedit bearbeiten
Bild einer .htaccess Datei

Das Abspeichern kann mitunter zu Schwierigkeiten führen. Bei Notepad++ beispielsweise solltest du bei der Auswahl des Dateityps auf „alle Typen“ umschalten. Dann kannst du die Datei ohne Endung speichern. Zum Überprüfen kannst du einen Rechtsklick auf die Datei vollführen, hier klickst du auf Eigenschaften und besuchst den Reiter „Allgemein“. An dieser Stelle sollte .htaccess Datei stehen und nichts anders.

Für Apache-Webserver geeignet

Die .htaccess als Konfigurationsdatei wirst du auf allen gängien Apache-Webservern finden und verwenden. Und Apache selbst ist gängig genug ; ) Alternativ könnte deine Website auf einen nginx-Webserver basieren. Hier kannst du keine htaccess verwenden können, sondern musst die Regeln in NGINX-Regeln umwandeln.[1]timmehosting.de: htaccess Converter Aus folgender Anweisung einer Weiterleitung

rewrite ^/mein--alter-blogpost/$ https://www.domainname.de/mein-aktueller-blogpost/ permanent;

wird nach dem Nutzen des nginx-Converters:

rewrite ^/mein--alter-blogpost/$ https://www.domainname.de/mein-aktueller-blogpost/ permanent;

Egal, ob im Verzeichnis deines Hosters eine htaccess liegt (Apache) oder eine nginx-Konfiguration verwendet wird, alle Konfigurationsänderungen werden sofort wirksam. Daher ist ein verantwortungsvoller Umgang wichtig. Fehlerhafte Einstellungen und Konfigurationen in deiner .htaccess-Datei können erhebliche Schäden auf der betroffenen Website verursachen. Daher ist das beschriebene Backup essentiell.

Beide Server haben ihre eigenen Stärken und sind in bestimmten Szenarien jeweils besser geeignet. Die Wahl zwischen Nginx und Apache hängt letztlich von den spezifischen Anforderungen und dem geplanten Einsatzszenario ab.

  • Performance: Nginx hat die Nase vorn bei hoher Last und vielen gleichzeitigen Verbindungen.
  • Konfiguration: Nginx bietet eine einfachere und klarere Konfigurationsstruktur.
  • Erweiterbarkeit: Apache bietet mehr Module und Erweiterungsmöglichkeiten.
  • Anwendungsfälle: Nginx eignet sich besonders gut als Reverse Proxy und für statische Inhalte, während Apache durch seine Flexibilität und breite Unterstützung für dynamische Inhalte punktet.

Standardinhalt für WordPress

Jedes WordPress fügt einige Zeilen in die .htaccess Konfigurationsdatei ein. Einige Plugins greifen ebenfalls auf die Datei zu und tragen einige Zeilen ein. Meist wird dies mit einem Kommentar ersichtlich. Die von WordPress eingefügten Zeilen sind dafür da, dass du URLs ändern und sprechende URLs erzeugen kannst.

# BEGIN WordPress

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

# END WordPress

Verwendest du eine WordPress Multisite Installation, sieht der Code geringfügig anders aus. Mehr dazu erfährst du direkt im htaccess WordPress Codex.

# BEGIN WordPress (3.5+ Multisite Subdomain)
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

# add a trailing slash to /wp-admin
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^(.*\.php)$ $1 [L]
RewriteRule . index.php [L]
# END WordPress

wp-config.php schützen

Die wp-config.php eine wichtigste Schnittstelle, wodurch du sie für Hacker unzugänglich machen solltest. Mit folgender Anweisung gelingt dir dies bereits:

# wp-config.php schützen

< files wp-config.php>
order allow,deny
deny from all
< /files>

Korrekte Domainumleitung

Nicht jeder Webserver beziehungsweise dessen jeweilige Domainkonfiguration ist korrekt eingestellt. Daher solltest du die Umleitungen auf die Ziel-Domain festlegen. In unserem Fall sollen alle Varianten auf https://www.deinwp.de/ zeigen.

  • Generell SSL verwenden
  • mit www ansprechen
  • und ein / am Ende führen

Rufst du die Domain über http://deinwp.de auf, wird direkt – ohne weitere Weiterleitungen – auf die richtige URL umgeleitet. Ob deine Domain bereits korrekt konfiguriert ist, kannst du mit Redirect Checker prüfen. Falls nicht, hier der passende Code die Umleitung der Domain. Alleridngs musst du hierfür deine .htaccess Datei mit folgender Zeile starten. Ohne diese läuft nichts, denn sie aktiviert das mod_rewrite-Modul. WordPress bringt das direkt beim Standardeintrag mit. Dazu erfährst du gleich mehr.

RewriteEngine On
# Domainumleitung mit https und www
RewriteCond %{HTTP_HOST} ^deinwp.de [NC]
RewriteRule (.*) https://www.deinwp.de/\ [R=301,L]

Das Ergebnis ist Folgendes:

Eingabe: http://deinwp.de ermöglicht die
Ausgabe: https://www.deinwp.de/

Eingabe: http://www.deinwp.de ermöglicht ebenfalls die
Ausgabe: https://www.deinwp.de/

Eingabe: https://deinwp.de/
Ausgabe: https://www.deinwp.de/

Wenn du alle URLs eines Unterverzeichnisses auf https umleiten möchtest, bekommst du das mit folgenden Zeilen hin. Beachte, dass hier die .htaccess-Datei im Unterordner des gewünschten Verzeichnisses abgelegt werden muss:

# https-Umleitung eines Unterverzeichnisses
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Interne URLs umleiten (301)

Sobald du einen Inhalt veröffentlichst, wird eine URL erstellt. Allerdings kann es im Laufe der Zeit passieren, dass du alte Blogbeiträge löschst oder sich die URLs ändern. Bei Beiträgen und Seiten hilft dir das System direkt weiter, indem es automatisch eine Weiterleitung anlegt. Aber bei gelöschten Beiträgen gibt es keine passende Entsprechung und beim Aufruf wird eine 404-Fehlermeldung ausgegeben. Externe Links zeigen dadurch auf eine nicht mehr existierende Seite und die Nutzer erleiden eine Mikroenttäuschung. Das muss nicht sein, also leite die jeweiligen Seiten um:

# Interne 301 Weiterleitungen Alt zu Neu
RedirectPermanent /mein--alter-blogpost/ https://www.domainname.de/mein-aktueller-blogpost/

Die Eingabe von https://www.domainname.de/mein-alter-blogpost führt somit zur
Ausgabe: https://www.domainname.de/mein-aktueller-blogpost/.

Zur besseren Übersicht in deiner .htaccess kannst du anstatt „RedirectPermanent“ auch „Redirect 301“ verwenden. Mit „301“ übermittelst du den gewünschten Status-Code. In dem Fall 301 = Permanente Weiterleitung. „Redirect“ entspricht dem Statuscode „302“ und somit einer temporären Weiterleitung. Daher kannst du auch auf „Redirect 301“ und „Redirect 302“ oder „Redirect 410“ als Befehl verwenden.

Externe Nutzung von Bildern vermeiden

Image-Hotlinking verwenden nicht nur Spam-Seiten, sondern ist eine Möglichkeit ohne Quellennennung ein Bild zu verwenden. Allerdings verursachen viele verlinkte Bilder auf anderen Websites, Traffic auf deiner Seite. Daher kann es sinnvoll sein, das Hotlinking von Bildern abzustellen. Wir sperren diesen Zugriff nicht einfach nur, sondern fügen ein spezielles Bild hinzu, was stattdessen angezeigt wird.

# Kein Image Hotlinking - Ersetzung mit speziellem Bild
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?deinwp.de [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ https://www.deinwp.de/hotlink.jpg [NC,R,L]

Dieser Code kann RSS-Reader beeinträchtigen. Deine Bilder werden womöglich nicht mehr ausgegeben. Überprüfe daher, ob die gängigsten RSS-Reader deine Bilder anzeigen oder nun das „Anti Hotlinking Image“.

Passwortschutz mit .htaccess/.htpasswd

Im Idealfall kannst du den Verzeichnisschutz/Zugriffsschutz via htaccess und htpasswd mittels Konfigurationsoberfläche beim Hoster erledigen. Sollte dies nicht wie gewünscht funktionieren, kannst du dies mit folgenden Zeilen selbständig erledigen: Die .htaccess muss in diesem Fall im zu schützenden Unterverzeichnis liegen.

Code für deine .htaccess

# Ordner mit Passwortschutz
AuthName "Admin-Bereich"
AuthType Basic
AuthUserFile /pfadzur/.htpasswd
require valid-user

Im Anschluss musst du den Inhalt für die .htpasswd Datei erzeugen. Am einfachsten gelingt dir das mittels htpasswdgenerator.de. Gib den gewünschten Benutzernamen in das Tool ein und such dir ein Passwort aus. Als Verschlüssekung kannst du „md5“ verwenden. Dein Ergebnis sollte in etwa wie folgt aussehen:

Code für die .htpasswd

benutzer:$1$l\l{SWcz$gj79dl7d40HPFwGECKPJA0

Diese Zeile schreibst du in eine leere Datei, die du .htpasswd nennst. Danach legst du Konfigurationsdatei auf deinen Server, in das Stammverzeichnis des Webspaces ab.

Sinnvoll ist der Passwortschutz beispielsweise für den /wp-admin/ und /wp-login/ Bereich, denn so gelangen Angreifer nicht bis zum Login. Wenn du mehr über das Thema erfahren möchtest, lies unseren Artikel zum Thema WordPress Sicherheit.

Zugriff auf bestimmte Dateien trotz Passwortschutz

Sollte sich im geschützten Ordner Dateien befinden, die zugänglich bleiben müssen, dann kannst du den partiellen Zugriff erlauben. Im konkreten Fall wäre das die admin-ajax.php im /wp-admin/ Ordner. Ermögliche den Zugriff auf diese eine Datei, trotz Passwortschutz mit folgenden Zeilen

# Zugriff auf admin-ajax.php zulassen
<Files admin-ajax.php>
Order allow,deny
Allow from all
Satisfy any
</Files>

Zugriff auf bestimmte Dateien verbieten

Im umgekehrten Fall kannst du einzelne Dateien ausschließen. Diese können dann von außen nicht aufgerufen werden. So kannst du spezielle Dateien vor unerwünschten Zugriffen schützen.

# Zugriff auf bestimmte Datei verhindern
 <files datei.php>
 order allow,deny
 deny from all
 satisfy all
 </files>

Zugriff von bestimmten IP-Adressen verhindern

Gleichermaßen lässt sich der Zugriff bestimmter IP-Adressen verhindern. Somit kannst du beispielsweise bestimmte Spam-Attacken oder aktuelle Angriffswellen über eine IP-Adresse in der .htaccess Datei sperren. Ebenso kannst du auf diese Weiße den Zugriff aus bestimmten Ländern verweigern und wenn du die IP konkreter Crawler kennst, kannst du deren Zugriff verhindern. Sogar das Erstellen einer Whitelist wäre damit möglich.

# Zugriff mit bestimmter IP-Adresse verhindern
order allow,deny
deny from 987.654.3.21
deny from 10.10.10.20
allow from all

URL-Phrasen blocken

Ebenso lassen sich spezifische „SQL Keywords“ innerhalb der Kommunikation zu deinem Webserver blockieren. Damit wird einem potenziellen Angreifer einen 403 (Zugriff nicht erlaubt | Forbidden) Hinweis, spezifisch HTTP-Statuscode, gezeigt.[2]kinsta.de: SQL Injection. Zugriff am 3. Juli 2024

# 403 Fehler zeigen, wenn Begriffe in der URL auftauchen
RewriteCond %{QUERY_STRING} [^a-z](declare¦char¦set¦cast¦convert¦delete¦drop¦exec¦insert¦meta¦script¦select¦truncate¦update)[^a-z] [NC]
RewriteRule (.*) - [F]

Inhalte eines Verzeichnis im Browser anzeigen oder verbergen

Wenn du den Verzeichnisinhalt eines Ordners im Browser anzeigen möchtest, kannst du das mittels .htaccess ermöglichen. Sinnvoll insbesondere für private und passwortgeschützte Bereiche deiner Website. Im Anschluss wird der Inhalt des Verzeichnis im Browser aufgelistet.

# Verzeichnisinhalt anzeigen
Options +Indexes
# Verzeichnisinhalt verbergen
Options -Indexes

Auslesen der Benutzer verhindern (WordPress spezifisch)

WordPress bietet die Option über domainname.tld/?author=1 den Benutzer auszulesen, welcher hinter der ID 1 steht. Du wirst also direkt auf die entsprechende Autorenseite von ID 1 weitergeleitet. So könnten Benutzernamen für Loginversuche einfach ausgelesen werden. (Obwohl wir ja das Loginfeld hinter einem Passwortschutz verstecken ; ). Dennoch kannst du das Auslesen zumindest etwas erschweren. Versucht jemand das Auslesen des Benutzers, wird dieser auf die Startseite deiner Webiste verwiesen.

# Auslesen der Benutzer verhindern
RewriteCond %{QUERY_STRING} .*author=(.+.?) [NC]
RewriteRule (.*) /?author= [NC,L,R=301]

Trailing Slash anfügen

Eine URL sollte einzigartig sein, denn sonst muss sich ein Crawler entscheiden. Verlinkst du beispielsweise intern auf die Seite: https://www.deinwp.de/faq/, aber deine Konfiguration bietet auch https://www.deinwp.de/faq gibt es von der Seite zwei Versionen. Häufig existiert im Hintergrund eine priorisierte URL und dann wird die korrekte mittels Canonical-Auszeichnung bestimmt. Besser ist es allerdings, wenn automatisch die korrekte URL gewählt wird. Wir halten eine Website-Struktur mit Trailing-Slash für ideal!

Was soll passieren?

https://www.deinwp.de/faq soll sich zu https://www.deinwp.de/faq/ wandeln

## Add trailing slash
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ https://www.domainname.tld/\/ [L,R=301]

In vereinzelten Konfigurationen führt diese Regel zu ungewöhnlichen Fehlern. So änderte WordPress im Anschluss den Titel des Beitrags nicht mehr. Bei neuen Artikeln wurde dieser auf „Automatisch gespeicherter Entwurf“ gesetzt. Daher musste eine elegantere Methode her:

# Add trailing slash
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteCond %{REQUEST_FILENAME} !.(css|xml|js|php|scss|webp)$ [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/\/ [L,R=301]

In Zeile 6 werden Ausnahmen definiert. Hier könnten noch weitere Dateitypen eingefügt werden. Da allerdings die Condition RewriteCond %{REQUEST_FILENAME} !-f besagt, dass nur bei nicht existenten Dateien weitergelesen werden soll, gehören hier nur dynamisch erzeugte Dateien hinein. Eine dynamische Umschreibung (RewriteRule) ist zudem eleganter als die festgelegte: https://www.domainname.tld Variante, denn diese musst du ja noch auf deine Domain anpassen.

Trailing Slash entfernen

Möchtest du bewusst den umgekehrten Effekt erreichen, dann verwende folgende Zeilen.

Was soll passieren?

https://www.deinwp.de/faq/ soll sich zu https://www.deinwp.de/faq wandeln

## Remove trailing slash
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [R=301,L]

PHP Einstellungen anpassen

Einige PHP-Systemwerte lassen sich über die .htaccess-Datei konfigurieren.

Entscheide dich, denn vielleicht hast du die Einstellungen bereits bei deinem Webhoster oder in der wp-config.php getätigt.

Alternativ kannst du das „php_memory_limit“ von 128 MB auf 256 MB erhöhen oder die maximale Ausführungszeit eines PHP-Scripts von 17 Sekunden auf 300 Sekunden verändern. Sollten die Anpassung keine Wirkung zeigen, müssen die Einstellungen an anderer Stelle erfolgen.

# Anpassung der PHP Einstellungen
php_value memory_limit 256M
php_value post_max_size 32M
php_value upload_max_filesize 24M
php_value max_execution_time 300

Du kannst sogar die PHP-Version mittels htaccess-Datei einstellen und so beispielsweise auf eine ältere Version umstellen. Wenn dein Provider beispielsweise auf Version 8.x umgestellt hast, du allerdings eine Software hast, die nur mit PHP-Version 7.4 funktioniert. Oder mehrere WordPress-Instanzen sollen auf unterschiedlichen Versionen laufen. Dein Webhosting-Paket kann diese Einstellung allerdings nur global vornehmen. Zwei Konfigurationstypen gibt es hierbei:

Mit „AddHandler“ kannst du festlegen, wie bestimmte Dateitypen vom Server behandelt werden sollen. Ein Handler ist quasi ein kleines Programm oder Skript, das ausgeführt wird, wenn der Server eine Datei eines bestimmten Typs anfordert. Zum Beispiel, wenn du eine Datei mit der Endung .php aufrufst, wird der PHP-Handler aktiviert und führt entsprechend das PHP-Skript aus.

Mit „AddType“ legst du den MIME-Typ einer Datei fest. Der MIME-Typ sagt dem Browser, wie er eine bestimmte Datei interpretieren soll. Zum Beispiel, wenn du ein Bild im PNG-Format hast und den MIME-Typ auf „image/png“ setzt, weiß der Browser, dass er das Bild als PNG interpretieren soll und kann es entsprechend darstellen. Andere MIME-Typen sind beispielsweise .doc, .pdf, .html, .gif, .jpg usw.

Also, im Grunde genommen benutzen wir „AddHandler“, wenn wir Dateien auf dem Server verarbeiten möchten, und „AddType“, wenn wir Dateien in den Browsern der Benutzer verarbeiten wollen. Bestimmte Dateitypen wie .php müssen auf dem Server und nicht im Browser des Benutzers verarbeitet werden. Deshalb ist es besser, „AddHandler“ zu verwenden, damit alles reibungslos funktioniert.

# PHP Version einstellen
AddHandler php56-cgi .php
AddHandler php74-cgi .php
AddHandler php80-cgi .php

Folgende Einstellung, um genau zu sein tatsächlich Version 5.4, hatte ich in einer htaccess einer alten Website entdeckt. Daraufhin die weiteren Einstellungen geprüft und diese erledigen die beschriebene Verwendung der PHP-Version ebenfalls. Typischer ist allerdings folgende Anweisung für PHP 8.0.

# PHP-Version 8.0 einstellen
AddHandler x-httpd-php8.0 .php

Zusätzlich kannst du mittels OPCache einen Zwischenspeicher für PHP-Code integrieren. So wird PHP im Arbeitsspeicher des Servers abgelegt und dessen Ausführung beschleunigt. Funktioniert aber nicht bei jeder Anwendung.

# PHP 8.0 mit OPcache 
AddHandler x-httpd-opcache-php8.0 .php

Möchtest du dagegen die PHP-Version mit AddType einstellen, musst du folgende Anweisung verwenden:

# PHP 8.0 mit OPcache 
AddType application/x-httpd-php8 .php

HSTS aktivieren

Im Security-Header-Artikel wurde diese Option bereits erwähnt und hier noch einmal ausführlich beschrieben. Sobald du sichergestellt hast, dass deine Seite über das HTTPS Protokoll ausgeliefert wird, kannst du den HSTS-Header einfügen. Im Abschnitt zur Domainumleitung wurden alle Restriktionen für den folgenden Test getroffen: Wenn du deine Seite http://meinedomain.tld aufrufst, solltest du auf eine https Version verwiesen werden. So geschehen bei dem Aufruf von: http://deinwp.de/ der auf https://www.deinwp.de/ endet.

# HSTS Header aktivieren
Header set Strict-Transport-Security: "max-age=31536000; includeSubDomains;" env=HTTPS

Dabei gibt max-age die Dauer in Sekunden an, die der Browser die Regel zwischenspeichert. Dabei stehen 3153600 Sekunden für die Dauer von einem Jahr. [3]Definition in RFC 6797 Empfohlen wird eine Mindestdauer von 120 Tage, also 10368000 Sekunden.

Die Erweiterung env=HTTPS stellt sicher, dass der HSTS-Header nur gesendet wird, wenn deine Seite via HTTPS ausgeliefert wird.
Mit dem Zusatz always vor der Anweisung set Strict-Transport-Security gilt der Befehl auch für Fehlerseiten.

# HSTS Header aktivieren
Header always set Strict-Transport-Security: "max-age=31536000; includeSubDomains;" env=HTTPS;

Damit der Browser die HSTS Policy für alle Subdomains nutzt, muss der Ausdruck um das Kürzel includeSubDomains erweitert werden. In den meisten Fällen wird dieser Effekt gewünscht sein. Allerdings muss jede Subdomain via HTTPS erreichbar sein. Du brauchst also für alle Subdomains ein eigenes SSL-Protokoll.

Die preoload Angabe, macht genau das – Direktive werden vorgeladen, wodurch ungewünschte Effekte entstehen können. [4]Vergleich: ComputerWeekly.de und hstspreload.org

  1. Können versehentlich eingetragene Subdomains nicht mehr sofort entfernen
  2. Kann der Zeitraum nachträglich nicht verändert werden. (Wenn neue Subdomains eingetragen werden)
  3. Einige Intranets sind nur via HTTP erreichbar, wodurch die HSTS Anweisung nicht greift.

Wenn du dir diesen „Gefahren“ bewusst bist, dann kannst du folgende Angabe nutzen:

# HSTS Header mit Preload aktivieren 
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

Optimierungen vornehmen

Mittels weniger Zeilen innerhalb deiner .htaccess kannst du deine komplette Website beschleunigen.

Browsercaching

Du gibst dem Browser Anweisungen, wie er mit den Inhalten deiner Seite umgehen soll. Der Browser soll beispielsweise nicht bei jedem Seitenaufruf alle Ressourcen, wie Grafiken & Javascript, neu laden. Er soll auf seinen eigenen Cache zurückgreifen und dadurch Ladezeit „sparen“. Aktivieren lässt sich das Browsercaching mit folgenden Zeilen:

# Browser Caching
ExpiresActive On
ExpiresByType image/jpg "access 1 month"
ExpiresByType image/jpeg "access 1 month"
ExpiresByType image/gif "access 1 month"
ExpiresByType image/png "access 1 month"
ExpiresByType image/x-icon "access 1 month"
ExpiresByType text/css "access 1 month"
ExpiresByType application/pdf "access 1 month"
ExpiresByType text/x-javascript "access 1 month"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresDefault "access 3 days"

GZIP Komprimierung aktivieren

Im nächsten Schritt sollen die Daten noch komprimiert werden und so die zu übertragende Datenmenge reduzieren. Wichtig für die GZIP-Komprimierung ist, dass dies von deinem Server unterstützt werden muss. Mit dem GZIP compression Testing Tool kannst du vorab prüfen, ob bereits GZIP aktiv ist. Dort erkennst du nach der Einbindung zudem, ob alles funktioniert und wie viel eingespart wird. Nicht alle Server unterstützen die folgende Variante.

# GZIP Komprimierung aktivieren
<ifModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file .(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>

mod_deflate aktivieren

Damit alle Ressourcen komprimiert werden, kommt noch mod_deflate zur Anwendung. Beachte dabei bitte, dass dieser Befehl erst nach der GZIP-Komprimierung in deiner .htaccess stehen darf. Die Reihenfolge ist wichtig! Ergänze gern spezifische Dateitypen oder entferne ungewünschte!

# mod_deflate aktivieren
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/vtt 
AddOutputFilterByType DEFLATE text/x-component
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/js
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/x-httpd-php
AddOutputFilterByType DEFLATE application/x-httpd-fastphp
AddOutputFilterByType DEFLATE application/atom+xml 
AddOutputFilterByType DEFLATE application/json
AddOutputFilterByType DEFLATE application/ld+json 
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject 
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/font-woff2
AddOutputFilterByType DEFLATE application/x-font-woff
AddOutputFilterByType DEFLATE application/x-web-app-manifest+json font/woff
AddOutputFilterByType DEFLATE font/woff 
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon 
</IfModule>

htaccess Regeln erklärt

Da die Regeln kompliziert sind und ich/wir bei jeder Recherche neue Dinge lernen, fangen wir an, die einzelnen Regeln detailliert zu erklären: Begegnen werden und hier häufig Rewriotecond, Rewriterule und Rewriteengine.

# Weiterlesen nur bei nicht existenten Dateien
RewriteCond %{REQUEST_FILENAME} !-f

# Angabe von Dateinamen, bei denen die folgende Regel geschehen soll
RewriteCond %{REQUEST_FILENAME} !.(css|xml|js|php|scss|webp)$ [NC]

Quellen und Fußnoten[+]

Erkunde weitere Beiträge

2 Gedanken zu „htaccess – Grundlagen & Beispiele“

  1. Es erstaunt mich, dass hier noch niemand einen Kommentar hinterlassen hat. Vielleicht werden sie gar nicht freigeschaltet? Aber der Artikel ist wirklich großartig! Eigentlich wollte ich nur eine Weiterleitung über .htaccess einrichten und bin dann auf diesen fantastischen Beitrag gestoßen.

    Vielen Dank dafür!

    Antworten
    • Hallo Harry.
      Die Kommentare werden bei uns zeitnah freigeschaltet und so nun auch deiner. 🙂
      Danke für das Feedback und super, dass du hier alles gefunden hast für deine .htaccess-Weiterleitung.

      LG
      Maik

      Antworten

Schreibe einen Kommentar