WordPress .htaccess für schnelle Ladezeiten

Perfekte WordPress .htaccess für kurze Ladezeiten

Meine perfekte WordPress .htaccess, damit auch deine Website schneller lädt. Die Geschwindigkeit einer Webseite ist nicht nur für den Besucher wichtig, sondern auch Google fordert einen schnellen Seitenaufbau. Mit Browser-Caching und gzip Komprimierung können wir in der .htaccess dafür sorgen, dass der Blog spürbar schneller lädt. Anwendbar für WordPress und für jede andere Webseite.

Hattest du bis jetzt eine nicht optimierte oder gar keine .htaccess-Datei, wird die folgende Anleitung deine Webseite garantiert schneller machen. Versprochen!

Bereits im April 2010 hatte Google offiziell verkündet, dass die Website-Geschwindigkeit als Faktor in das Ranking bei Google aufgenommen wird.

Site Speed ist also ein Rankingfaktor!

Bestes WordPress Hosting

Hosting-Empfehlungen sind normalerweise Müll.

Oft werden extrem billige Hosting-Pakete für € 3 empfohlen, andere wiederum werben mit einem € 100 VPS, weil sie als Affiliate dabei am meisten verdienen. Im Endeffekt wollen wir doch alle nur den schnellstmöglichen Webspace für möglichst wenig Geld.

Und zwar für WordPress optimiert!

Was ist noch wichtig? Der Server sollte in Deutschland liegen und der Support möglichst schnell antworten, am besten auf Deutsch.

Das alles bekommst du bei Raidboxes ab € 9,00 / Monat.

Ich kann mich noch gut erinnern. Damals wurden die Ladezeiten von vielen Webmastern noch nicht so ernst genommen. Im Jahre 2000 wurde mit Javascript und Flash nicht gegeizt. Die Webseiten Designs waren fulminant und aufgebläht. Das krasse Gegenteil zum aktuellen Flat Design Boom.

Was ist die .htaccess?

Inhalt der Standard WordPress .htaccess
Inhalt der Standard WordPress .htaccess

Die Datei namens .htaccess ist nicht unbedingt notwendig, um eine Webseite zu betreiben.

Seltsam mag dir der Name mit einem Punkt davor vorkommen. Auf Betriebssystemen wie Linux und Unix, worauf die meisten Webserver laufen, bedeutet das aber lediglich, dass diese Datei unsichtbar ist. Mehr steckt hinter diesem Punkt vor einem Dateinamen nicht.

Die Einstellungen darin gelten auch für alle darunter liegenden Dokumente. Du musst die Datei also nicht in jedes Unterverzeichnis kopieren. Bei WordPress wird die Datei mitgeliefert, da sie für die sogenannten Permalinks notwendig ist. Dabei werden die unschönen URLs in lesbare Adressen umgewandelt.

Ich verwalte seit Jahren eine Vorlage meiner perfekten .htaccess Datei, die ich für all meine Webseiten nutze. Meine .htaccess-Vorlage optimiere ich ständig und teste neue Funktionen. Verbesserungen trage ich dann auf allen anderen Seiten nach.

Wo finde ich die WordPress .htaccess?

WordPress .htaccess im Document-Root
WordPress .htaccess im Document-Root

Diese Datei liegt im Document-Root deiner Webseite. Also dort wo auch die index.html oder index.php liegt.

Bei WordPress erkennst du das Stammverzeichnis an den Ordnern wp-admin, wp-content und wp-includes. In deinem FTP-Programm findest du die htaccess-Datei gleich darunter.

Im Regelfall wird nur eine .htaccess genutzt, die sich auch auf alle darunter liegenden Verzeichnisse und Dateien auswirkt.

Die Standard WordPress .htaccess Datei

WordPress legt automatisch eine Standard .htaccess Datei für jede neue Installation an. Falls die Datei nicht existiert, kannst du sie im Menü Einstellungen > Permalinks mit einem Klick auf den Button Änderungen speichern neu erstelle.

Der Inhalt der Standard WordPress .htaccess Datei:

# BEGIN WordPress
# The directives (lines) between "BEGIN WordPress" and "END WordPress" are
# dynamically generated, and should only be modified via WordPress filters.
# Any changes to the directives between these markers will be overwritten.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Mehr schreibt WordPress nicht in diese Konfigurationsdatei. Sind bei dir weitere Direktiven vorhanden, stammen die von einem Plugin.

Die richtigen Dateiberechtigungen

Berechtigungen

Damit deine .htaccess Datei vor unberechtigten Zugriffen geschützt ist, sollte sie die richtigen Dateiberechtigungen besitzen.

Auf Unix und Linux-Systemen werden die Rechte durch eine dreistellige Zahl angegeben. Stelle sicher, dass die Berechtigung 644 zugewiesen ist.

Das kannst du in deinem FTP-Programm wie Filezilla machen, in dem du die Datei mit der rechten Maustaste anklickst und Dateiberichtigungen… wählst.

Für den Besitzer wählst du Lesen und Schreiben aus und für die Gruppen- und öffentliche Berechtigungen wählst du nur Lesen aus.

Vorsicht bei Änderungen

Sei vorsichtig bei Änderungen. Ist nur ein Buchstabe auf dem falschen Platz, kann es sein, dass deine ganze Website nicht mehr lädt.

Deshalb mache immer ein WordPress Backup, bevor du die .htaccess anfasst. Ich nutze dafür den Dienst BlogVault.

Deine Änderungen solltest du vor den, original WordPress Direktiven einfügen. Diese erkennst du, weil sie zwischen den Kommentaren BEGIN WordPress und END WordPress liegen.

Zeilen, die mit einem # Zeichen beginnen, sind Kommentare, die sich nicht auf die Funktion auswirken.

Die .htaccess anpassen und erweitern

Für die Geschwindigkeit sind das Caching und die gzip Komprimierung die wichtigsten Maßnahmen in der .htaccess. Es können aber noch viele weitere Dinge darin geregelt werden.
Die Datei kannst du mit einem beliebigen Editor öffnen. Ich nutze dafür Notepad++ oder VS Code und den FTP Client FileZilla.

Die Standard .htaccess von WordPress schaut so aus:

Die Standard WordPress htaccess

Die vorhandenen Regeln lassen wir ganz am Ende der Datei stehen. Alles Neue fügen wir davor ein.

1. Browser Caching aktivieren

Die folgenden Regeln sagen dem Browser wie lange bestimmte Elemente lokal gespeichert werden sollen und auch von dort wieder geladen werden sollen. Das lokale .htaccess Browser Caching.

Ich weiß, dafür gibt es im Netz Vorlagen, die dreimal so lange sind. Mehr hilft aber nicht immer mehr. Endlose Anweisungen lassen die .htaccess nur unhandlich und unübersichtlich werden.
Die Einstellungen habe ich über Jahre gesammelt und getestet. Damit bekommst du das beste Ergebnis.

# Browser Caching
<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresDefault "access 5 seconds"
  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/ico "access 1 month"
  ExpiresByType image/x-icon "access 1 month"
  ExpiresByType text/css "access plus 1 day"
  ExpiresByType text/javascript "access 1 month"
  ExpiresByType application/javascript "access 1 month"
  ExpiresByType application/x-javascript "access 1 month"
  ExpiresByType application/x-shockwave-flash "access 1 month"
</IfModule>

# Alternatives Caching
<IfModule mod_headers.c>
  Header append Cache-Control "public"
  Header append Vary Accept-Encoding
  Header set Connection keep-alive
  Header unset ETag
  FileETag None
</IfModule>

2. gzip Komprimierung des Datenverkehrs

gzip Test Tool auf websiteplanet.com/de/webtools/gzip-compression/
gzip Test Tool auf websiteplanet.com/de/webtools/gzip-compression/

gzip ist ein offener Komprimierungs-Standard ähnlich wie ZIP. Die Website wird vor dem Download damit komprimiert und im Browser wieder dekomprimiert. Damit lassen sich bis zu 80 Prozent des Datenverkehrs einsparen. Natürlich verringert sich dadurch auch die Ladezeit enorm.

LESEN
WordPress Login und wp-login.php vor Brute-Force Angriffen sichern

Auf websiteplanet.com kannst du überprüfen ob gzip aktiv ist.

Mit Cloudflare ist sogar die Brotli-Komprimierung aktiv, welche noch mal etwas effizienter ist.

# gzip Komprimierung
<IfModule mod_deflate.c>
  SetOutputFilter DEFLATE
</IfModule>

3. Wichtige WordPress Dateien schützen

Nach der WordPress-Installation sollen wichtige Dateien von außen nicht mehr erreichbar sein. Das ist zum Beispiel die wp-config.php, wo sich deine MySQL-Zugangsdaten befinden.

# Kein Zugriff auf install.php
<files install.php>
  Order allow,deny
  Deny from all
</files>
 
# Kein Zugriff auf wp-config.php 
<files wp-config.php>
  Order allow,deny
  Deny from all
</files>

# Kein Zugriff auf .htaccess und .htpasswd
<FilesMatch "(\.htaccess|\.htpasswd)">
  Order deny,allow
  Deny from all
</FilesMatch>

4. Image-Hotlinking verhindern – Bilderklau

Beim Bilder Hotlinking wird dein Bild von deinem Server auf einer anderen Website angezeigt. Das kann auf deinem Server erhebliche Leistungsforderungen bedeuten. Dadurch wird die Geschwindigkeit deiner Webseite beeinflusst.

Du kannst das Hotlinken verhindern, aber bedenke, dass deine Bilder dann auch nicht auf Social Media wie Facebook und Instagram angezeigt werden können.

Die Zeilen 5 – 7 sind Ausnahmen, von welchen Bilder abgerufen werden dürfen. „deinedomain.com“ musst du in dem Code zweimal mit deiner tatsächlichen Domain ersetzten.

# Image Hotlinking verhindern
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?deinedomain.com [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?google.com [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?facebook.com [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?instagram.com [NC]
RewriteRule \.(jpg|jpeg|png|gif|svg)$ https://deinedomain.com/hotlink-image.jpg [NC,R,L]

5. Redirects und 301 Weiterleitung

Seitdem die Verschlüsselung des Datenverkehrs mittels SSL zum Standard geworden ist, solltest du http immer auf https umleiten.

Die ultimative 301-Weiterleitung von http zu https:

# http zu https weiterleiten
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTPS} !=on
  RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

301 Weiterleitungen, wenn du die Adresse einer Seite oder eines Posts geändert hast:

# 301 Weiterleitungen
Redirect 301 /alte-seite/ http://deinedomain.com/neue-seite/

6. Verzeichnisse schützen

Du kannst Verzeichnisse mit einem Benutzernamen und Passwort schützen. Dafür muss die Konfiguration in die .htaccess-Datei und der Benutzername und das verschlüsselte Passwort in die .htpasswd-Datei.

Dafür solltest du dir die genaue Anleitung und den .htpasswd Generator ansehen.

# Verzeichniss schützen
AuthUserFile /pfad/zur/.htpasswd
AuthName "Passwortgeschützt!"
AuthType Basic
Require valid-user

7. Bestimmte IPs und Spammer ausschließen

Es kommt leider immer wieder vor, dass Spam von einer bestimmten IP auf deine Website einschlägt. Ersetze die X mit der zu sperrenden IP.

# Bestimmte IPs ausschließen

<Limit GET POST>
  order allow,deny
  deny from XXX.XXX.XXX.XXX
  deny from XXX.XXX.XXX.XXX
  allow from all
</Limit>

8. wp-admin für fremde IPs sperren

Wenn du von deinem Internetprovider eine statische IP-Adresse bekommst, kannst du das wp-admin Verzeichnis für alle sperren und nur für deine IPs freischalten.

Dafür musst du im Verzeichnis wp-admin eine neue .htaccess Datei anlegen und folgenden Code einfügen. Die X ersetzt du mit deiner IP.

# wp-admin Verzeichnis nur für bestimmte IPs freischalten
order deny,allow
deny from all
allow from XX.XXX.XXX.XXX

9. Benutzernamen schützen

Ein Brute Force Angriff auf deinen WP Admin verspricht nur erfolgreich zu werden, wenn der Benutzername bekannt ist.

So ist bei WordPress meist der erste erstellte Benutzer auch ein Admin. Welcher der erste Benutzer ist, kannst du herausfinden, indem du „/?author=1“ an die Domain anhängst. Mit den folgenden Zeilen kannst du das verhindern:

# Verhindert das einfache Auslesen von Nutzernamen
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} .*author=(.+.?) [NC]
RewriteRule (.*) /blog/?author= [NC,L,R=301]

Die perfekte WordPress .htaccess

Nun kommen wir aber zu meiner optimalen WordPress .htaccess Datei, die ich auf all meinen Blogs nutze.

Viele der oben gezeigten Direktiven sind Spezialfälle, die du bei Bedarf nutzen kannst. Diese habe ich weggelassen, da sie auch zu Problemen führen können.

Kopiere den folgenden Code und füge ihn in deine .htaccess ein:

# http zu https weiterleiten
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTPS} !=on
  RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

# Browser Caching
<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresDefault "access 5 seconds"
  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/ico "access 1 month"
  ExpiresByType image/x-icon "access 1 month"
  ExpiresByType text/css "access plus 1 day"
  ExpiresByType text/javascript "access 1 month"
  ExpiresByType application/javascript "access 1 month"
  ExpiresByType application/x-javascript "access 1 month"
  ExpiresByType application/x-shockwave-flash "access 1 month"
</IfModule>

# Alternatives Caching
<IfModule mod_headers.c>
  Header append Cache-Control "public"
  Header append Vary Accept-Encoding
  Header set Connection keep-alive
  Header unset ETag
  FileETag None
</IfModule>

# gzip Komprimierung
<IfModule mod_deflate.c>
  SetOutputFilter DEFLATE
</IfModule>

# Kein Zugriff auf install.php
<files install.php>
  Order allow,deny
  Deny from all
</files>

# Kein Zugriff auf wp-config.php 
<files wp-config.php>
  Order allow,deny
  Deny from all
</files>

# Kein Zugriff auf .htaccess und .htpasswd
<FilesMatch "(\.htaccess|\.htpasswd)">
  Order deny,allow
  Deny from all
</FilesMatch>

# BEGIN WordPress
# The directives (lines) between "BEGIN WordPress" and "END WordPress" are
# dynamically generated, and should only be modified via WordPress filters.
# Any changes to the directives between these markers will be overwritten.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Wie kann ich die Geschwindigkeit testen?

Bevor wir mit den Änderungen anfangen, müssen wir zuerst den aktuellen Zustand unserer Seite überprüfen, damit wir nachher auch einen Vergleich haben. Nur so können die Änderungen auch bewertet werden.

Ich nutze dafür am liebsten https://gtmetrix.com/.

Weitere Alternativen sind:

GTmetrix Test vor den Änderungen
GTmetrix – Test vor den Änderungen durchführen

Nachdem du deine Seite getestet hast, kennst du deinen aktuellen PageSpeed Wert, den YSlow Wert, die Ladezeit, die Downloadgröße und wie viele Requests (geladene Dateien wie CSS und JS) beim Laden deiner Seiten notwendig waren.

Vergleiche die Werte mit und ohne meiner optimalen Apache-Konfiguration.

Nginx Webserver und .htaccess

Falls dein Hoster einen Nginx-Webserver verwendet, kannst du alle hier angegebenen Konfigurationen nicht nutzen, da Nginx keine .htaccess verwendet.

Nginx verfügt auch über eine eigene Konfigurationsdatei, wo du ähnliche Settings vornehmen kannst.

Abschließende Worte

Falls dir das zu technisch ist, ist das WordPress Plugin WP Rocket vielleicht genau das Richtige für dich.
Das Caching-Plugin übernimmt auch die Konfiguration der .htaccess für dich.

Hattest du vorher eine Standard .htaccess oder gar keine, wirst du in allen Werten deutliche Verbesserungen sehen.

Du siehst, mit wenigen Eingriffen kann viel erreicht werden.

Das werden dir deine Besucher mit mehr Seitenaufrufen danken und die Suchmaschinen mit besseren Rankings.

4 Kommentare zu „Perfekte WordPress .htaccess für kurze Ladezeiten“

  1. Peter Polifka

    Hallo Jochen,
    sehr hilfreicher Artikel zur Optimierung der Ladezeiten über die Anpassung der .htaccess!

    So sieht echter Mehrwert für den Besucher eines Blogs aus – klasse :-)

    Werde ich auf jeden Fall testen und ggf. an Foren-Freunde verlinken…

    Beste Grüße
    Pete

  2. Grüß dich Jochen,

    erstmal: geiler Blog!

    Was hältst du von der G7 Firewall? Warum ist die nicht in deiner .htaccess? Ich hatte mit meiner alten .htaccess ziemlich Probleme und werde jetzt mal deine testen.

    (Gut, dass du den Hinweis mit dem Caching Plugin gesetzt hast) Woher soll man als Laie wissen, dass die Gzip-Komprimierung schon durch Wp-Rocket gesetzt wird..)

    Liebe Grüße aus München,

    Erwin

    1. Hallo Erwin,
      diese extrem aufgeblähten .htaccess Dateien sind nicht mein Fall. Ich habe in meiner .htaccess nur die wirklich notwendigen Regeln. Schlank und schnell!

      Ich bin kein Firewall-Profi, deshalb vertraue ich da lieber einem Firewall Plugin und bin somit auf der sicheren Seite.

      lg
      Jochen

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

 

Nach oben scrollen