Skip to content

Alles für WordPress, Webentwicklung — und mehr

🛠 So fügen Sie Expires-Header in .htaccess hinzu: Schritt-für-Schritt-Anleitung

🛠 So fügen Sie Expires-Header in .htaccess hinzu: Schritt-für-Schritt-Anleitung

Sie haben einen Test in GTmetrix durchgeführt, und dort erscheint es in Rot: „Add Expires Headers". Ein vertrauter Anblick. Die Website läuft auf WordPress, das Hosting auf Apache, und der Geschwindigkeitstest verlangt, dass Sie das Browser-Caching über eine .htaccess konfigurieren.

Der Fehler ist nicht kritisch, aber er stört. Ohne Expires-Header lädt der Browser Bilder, CSS und Skripte bei jedem Besuch erneut vom Server. Immer wieder. Selbst wenn sich nichts geändert hat. Die Geschwindigkeit sinkt, Nutzer warten, Google stuft das Ranking herab.

Sie können das in fünf Minuten beheben. Zwei Wege: manuell per Code in der.htaccess oder mit einem Plugin in zwei Klicks. Nachfolgend beide, mit fertigem Code und Einstellungen.

💡 Kurzer Überblick:

  • Verstehen, wie Expires- und Cache-Control-Header den Browser-Cache steuern
  • Fertigen Code in die.htaccess einfügen: kopieren, einfügen, prüfen
  • Das Plugin AEH Speed Optimization in einer Minute installieren, wenn Sie keinen Code anfassen möchten
  • Optimale Caching-Dauern für Bilder, CSS, JS und Schriften konfigurieren

Wie Expires-Header funktionieren

Wenn ein Besucher eine Website aufruft, lädt der Browser Dutzende Dateien: die HTML-Seite, CSS-Stile, JavaScript, Schriften, Icons, Bilder. Jede Datei ist eine separate HTTP-Anfrage an den Server. Je mehr Anfragen, desto länger die Ladezeit.

Der Expires-Header teilt dem Browser mit: „Diese Datei ändert sich nicht, speichere sie im Cache und frage erst wieder zu diesem Datum an." Bei wiederholten Besuchen holt der Browser die Dateien aus dem lokalen Cache, statt sie erneut vom Server zu laden. Ergebnis: Dutzende Anfragen weniger und schnelles Laden.

Das moderne Äquivalent ist der Cache-Control-Header mit der max-age-Direktive. Er setzt die Cache-Lebensdauer in Sekunden, nicht als festes Datum, und gilt heute als primär. Wir empfehlen, beide Header gleichzeitig zu konfigurieren: Expires für alte Browser und Proxys, Cache-Control für alles Moderne. Beide werden im selben.htaccess-Block geschrieben.

Fehler „Add Expires Headers“ im GTmetrix-Bericht

Methode 1: Code in der.htaccess

Der direkteste Weg ist, Caching-Regeln direkt in die Apache-Konfigurationsdatei einzufügen. Die .htaccess-Datei liegt im Wurzelverzeichnis der Website (dort, wo auch die wp-config.php liegt). Wenn Sie sie nicht sehen, aktivieren Sie die Anzeige versteckter Dateien in Ihrem FTP-Client oder dem Dateimanager des Hostings.

Laden Sie vor der Bearbeitung eine Kopie der Datei auf Ihren Computer herunter. Ein Syntaxfehler in der.htaccess kann die Website mit einem 500-Fehler lahmlegen, ein Backup erlaubt das Zurücksetzen in einer Sekunde.

Öffnen Sie die .htaccess in einem Editor und fügen Sie den folgenden Block vor # BEGIN WordPress ein:

1 # Browser caching: Expires and Cache-Control headers
2<IfModule mod_expires.c>
3 ExpiresActive On
4
5 # Images
6 ExpiresByType image/jpg "access plus 1 year"
7 ExpiresByType image/jpeg "access plus 1 year"
8 ExpiresByType image/gif "access plus 1 year"
9 ExpiresByType image/png "access plus 1 year"
10 ExpiresByType image/webp "access plus 1 year"
11 ExpiresByType image/avif "access plus 1 year"
12 ExpiresByType image/svg+xml "access plus 1 year"
13 ExpiresByType image/x-icon "access plus 1 year"
14
15 # CSS and JavaScript
16 ExpiresByType text/css "access plus 1 month"
17 ExpiresByType application/javascript "access plus 1 month"
18
19 # Fonts
20 ExpiresByType font/woff2 "access plus 1 year"
21 ExpiresByType font/woff "access plus 1 year"
22
23 # PDF and other documents
24 ExpiresByType application/pdf "access plus 1 month"
25
26 # Default
27 ExpiresDefault "access plus 2 days"
28</IfModule>
29
30 # Cache-Control headers for modern browsers
31<IfModule mod_headers.c>
32 &lt;FilesMatch &quot;\.(jpg|jpeg|png|gif|webp|avif|svg|ico|woff2|woff)$&quot;&gt;
33 Header set Cache-Control "max-age=31536000, public"
34 </FilesMatch>
35 &lt;FilesMatch &quot;\.(css|js)$&quot;&gt;
36 Header set Cache-Control "max-age=2592000, public"
37 </FilesMatch>
38</IfModule>

Was hier passiert. Der erste Block <IfModule mod_expires.c> aktiviert das Expires-Modul und setzt Speicherfristen für jeden Dateityp. Ein Jahr für Bilder und Schriften, sie ändern sich fast nie. Ein Monat für CSS und JavaScript, sie werden regelmäßig aktualisiert.

Der zweite Block <IfModule mod_headers.c> fügt das moderne Cache-Control mit denselben Fristen, aber in Sekunden hinzu: 31536000 = ein Jahr, 2592000 = ein Monat.

Wichtig: Die Module mod_expires und mod_headers müssen auf dem Server aktiviert sein. Bei den meisten Apache-Hosts sind sie standardmäßig aktiv: Der Support schaltet sie bei der Ersteinrichtung frei. Wenn das Caching nach dem Speichern nicht funktioniert, schreiben Sie an den Hosting-Support: „Bitte aktivieren Sie mod_expires und mod_headers."

Nach dem Einfügen speichern Sie die Datei und laden sie zurück ins Wurzelverzeichnis. Öffnen Sie die Website im Browser, gehen Sie zu DevTools (F12) → Netzwerk → Seite aktualisieren. Klicken Sie auf eine beliebige CSS- oder JS-Datei, im Tab „Header" sollten Sie Expires und Cache-Control mit Werten ungleich null sehen.

Führen Sie GTmetrix erneut aus, der Fehler sollte verschwunden sein.

Methode 2: AEH Speed Optimization Plugin

Wenn Sie nicht manuell in der.htaccess arbeiten möchten, gibt es ein Plugin. Es hieß früher einfach Add Expires Headers, heute ist es zu AEH Speed Optimization gewachsen. Neben Caching-Headern beherrscht es CSS-Minifizierung, Lazy Loading von Bildern und Komprimierung.

AEH Speed Optimization Plugin-Seite im WordPress-Katalog

Installationsschritte:

  • Plugins → Installieren, in der Suche „AEH Speed Optimization" eingeben

  • Klicken Sie auf Jetzt installieren, dann auf Aktivieren

  • Gehen Sie zu Einstellungen → AEH Speed Optimization

  • Aktivieren Sie auf dem Tab „Cache-Einstellungen" die Dateitypen und legen Sie die Speicherdauer in Tagen fest

Caching-Einstellungen im AEH Speed Optimization Plugin
  • Klicken Sie auf Senden

Das Plugin schreibt die Regeln selbstständig in die.htaccess, Sie müssen keine einzige Codezeile schreiben. Für die meisten Websites reicht die kostenlose Version. Die Pro-Version fügt Gzip-Komprimierung, Caching externer Ressourcen (Google Fonts, CDN-Skripte) und benutzerdefinierte Dateitypen hinzu.

Beispiel für die Festlegung von Speicherdauern für Dateigruppen

🔗 AEH Speed Optimization auf WordPress.org

Wenn Sie bereits ein Caching-Plugin wie W3 Total Cache oder WP Rocket nutzen, benötigen Sie kein separates Expires-Plugin. Jedes ernsthafte Cache-Plugin kann Expires- und Cache-Control-Header automatisch in die.htaccess einfügen. Gehen Sie in die Einstellungen Ihres Plugins und prüfen Sie, ob der Tab „Browser-Cache" aktiv ist.

Welche Caching-Dauer sollte man einstellen?

Es gibt keine allgemeingültige Antwort, die Dauer hängt davon ab, wie oft Sie einen bestimmten Dateityp ändern.

Liste der Dateitypen für die Caching-Konfiguration im Plugin

Dateityp

Empfohlene Dauer

Warum

Bilder (jpg, png, webp, avif, gif, svg)

1 Jahr

Ändern sich selten, wiegen viel, maximaler Cache-Nutzen

Icons und Favicon

1 Jahr

Ändern sich jahrelang nicht

Schriften (woff2, woff)

1 Jahr

Werden einmal eingebunden und nicht aktualisiert

CSS-Stile

1 Monat

Werden gelegentlich bearbeitet; bei einem Redesign Cache leeren

JavaScript

1 Monat

Gleiche Logik wie bei CSS

PDF und Dokumente

1 Monat

Werden selten heruntergeladen, können aber aktualisiert werden

Faustregel: Je stabiler die Datei, desto länger die Dauer. Für Bilder ist ein Jahr Standard. Für CSS und JS ist ein Monat ein vernünftiger Kompromiss zwischen Geschwindigkeit und Aktualität.

Wenn Sie die Website aktiv entwickeln und sich die Stile wöchentlich ändern, setzen Sie CSS auf eine Woche, nicht auf einen Monat. Wenn Sie mit den Änderungen fertig sind, kehren Sie zu einem Monat zurück.

⁉️🤔 Häufige Fragen

Ich habe Code in die.htaccess eingefügt, aber GTmetrix zeigt den Fehler immer noch an. Warum?

Der häufigste Grund ist, dass die Module mod_expires oder mod_headers auf dem Server nicht aktiviert sind. Schreiben Sie an den Hosting-Support mit der Bitte, beide Module zu aktivieren. Zweiter Grund: Sie haben den Code nach # BEGIN WordPress eingefügt, nicht davor. WordPress überschreibt alles, was nach seiner Markierung kommt. Drittens: Ein Caching-Plugin (W3 Total Cache, WP Rocket) verwaltet bereits die.htaccess und hat Ihre Regeln mit seinen eigenen überschrieben. Konfigurieren Sie in diesem Fall den Browser-Cache innerhalb des Plugins selbst, nicht manuell.

Was ist der Unterschied zwischen Expires und Cache-Control?

Expires setzt ein festes Datum und eine Uhrzeit („gültig bis 15. Juni 2027"). Cache-Control mit der max-age-Direktive setzt die Dauer in Sekunden ab dem Zeitpunkt der Anfrage („gültig für 31536000 Sekunden"). Cache-Control ist flexibler und hat Vorrang: Wenn beide gesetzt sind, folgt der Browser Cache-Control. Wir empfehlen, beide zu schreiben, für maximale Kompatibilität mit alten und neuen Clients.

Die Website läuft auf Nginx, die.htaccess funktioniert nicht. Was tun?

Die .htaccess-Datei ist eine Apache-Konfiguration. Nginx ignoriert sie. Bei Nginx werden Caching-Regeln mit der expires-Direktive im server-Abschnitt der Website-Konfigurationsdatei hinzugefügt. Wenn Sie Nginx nutzen (Hosts wie Kinsta, Cloudways), verwenden Sie das AEH Speed Optimization Plugin: Es funktioniert auf jedem Webserver, da es Header über PHP verwaltet, nicht über die Serverkonfiguration.

Muss ich Expires konfigurieren, wenn ich bereits ein CDN nutze?

Ja. Ein CDN (Cloudflare, BunnyCDN) speichert Inhalte auf seinen weltweiten Servern zwischen, aber der Browser-Cache ist eine separate Ebene. Richtig konfigurierte Expires- und Cache-Control-Header reduzieren sogar die Anfragen an das CDN: Der Browser geht für eine Datei gar nicht erst ins Netz, wenn seine lokale Kopie noch frisch ist. Zwei Cache-Ebenen, CDN + Browser, arbeiten zusammen und ersetzen einander nicht.

Kollidiert das AEH Speed Optimization Plugin mit meinem Cache-Plugin?

Das kann passieren, wenn beide versuchen, Regeln in die.htaccess zu schreiben. Deaktivieren Sie vor der Installation von AEH Speed Optimization den Browser-Cache in Ihrem Haupt-Caching-Plugin, oder behalten Sie umgekehrt ein Plugin, das sowohl Seiten-Cache als auch Browser-Cache verwaltet. WP Rocket und W3 Total Cache können alles out of the box, ein separates Expires-Plugin ist bei ihnen nicht nötig.

Sollte man Expires manuell konfigurieren oder reicht ein Plugin?

Wenn Sie sicher mit FTP arbeiten und keine Scheu vor einem Code-Editor haben, gibt Ihnen die manuelle Konfiguration über die.htaccess volle Kontrolle und fügt dem Admin-Bereich kein zusätzliches Plugin hinzu. Der obige Code: kopieren, einfügen, und die Sache ist erledigt.

Für alle anderen löst das AEH Speed Optimization Plugin die Aufgabe ohne das Risiko eines Tippfehlers in der Konfiguration. Zudem bietet es Minifizierung und Lazy Loading, was die Website ebenfalls beschleunigt.

Die Hauptsache ist, den GTmetrix-Fehler nicht so stehen zu lassen. Fünf Minuten für die Konfiguration der Expires-Header bringen einen spürbaren Geschwindigkeitsschub, und Geschwindigkeit ist sowohl Nutzererlebnis als auch Suchmaschinenranking.