WordPress .htaccess: Standard-Code und sinnvolle Regeln

Die .htaccess sagt dem Webserver, wie er Ihre Website auslie­fert. Hier finden Sie den Standard-Code von WordPress und fertige Regeln für Weiter­lei­tung, Schutz und Tempo.

  • Standard-Code zum KopierenDer Standard-Code von WordPress zum Kopieren
  • Fertige RegelnFertige Regeln für HTTPS, Schutz und Caching
  • Hilfe bei Fehler 500Was hilft, wenn danach Fehler 500 erscheint
So ist die .htac­cess aufge­baut
  • Ihre eigenen RegelnWeiter­lei­tungen und Schutz­re­geln, oberhalb des Word­Press-Blocks. bleibt
  • Der WordPress-BlockZwischen # BEGIN WordPress und # END Word­Press. WordPress schreibt ihn neu. nicht ändern
  • Blöcke von PluginsCache- und Sicherheits-Plugins setzen eigene Markie­rungen und pflegen sie selbst. Plugin
  • Caching und Kompres­sionEigene Regeln für kürzere Ladezeiten, auch unter­halb des Blocks. bleibt
Schreiben Sie nie zwischen die WordPress-Markie­rungen. Dort geht jede Ände­rung verloren.

Was die .htaccess ist

Die .htaccess ist eine Textdatei mit Anweisungen für den Webserver. Er liest sie bei jedem Aufruf, noch bevor Word­Press startet. WordPress braucht sie vor allem für sprechende Permalinks, also Adressen wie /kontakt/ statt /?p=12. Daneben steuern Sie damit Weiter­lei­tungen, Zugriffs­schutz und das Caching im Browser.

  • Gilt für ihren Ordner und alle Unter­ordner
  • Wirkt sofort, ohne Neustart
  • Ein Tippfehler legt die ganze Website lahm
Welcher Webserver sie liest
  • ApacheLiest die .htaccess bei jedem Aufruf, ohne Neustart. ja
  • LiteSpeedVersteht die .htaccess wie Apache. OpenLiteSpeed übernimmt nur einen Teil der Regeln. ja
  • NginxKennt keine .htaccess. Regeln gehören in die Server­kon­fi­gu­ra­tion, die der Hoster pflegt. nein
  • IIS (Windows)Nutzt statt der .htaccess die Datei web.config. web.config
Ihren Webserver sehen Sie unter Werkzeuge → Website-Zustand → Bericht → Server.

Die Standard-.htaccess von WordPress

Diesen Block legt WordPress bei einer normalen Instal­la­tion im Haupt­ver­zeichnis an. Sie können ihn genau so über­nehmen.

.htaccess für eine einzelne Website Apache, LiteSpeed
# BEGIN WordPress
# Die Direktiven (Zeilen) zwischen „BEGIN WordPress“ und „END WordPress“ sind
# dynamisch generiert und sollten nur über WordPress-Filter geändert werden.
# Alle Änderungen an den Direktiven zwischen diesen Markierungen werden überschrieben.
<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

Die Regeln sind einfach: Gibt es die aufgerufene Datei oder den Ordner wirklich, liefert der Server sie direkt aus. Alles andere geht an index.php, und WordPress sucht die passende Seite.

Die Zeile mit HTTP_AUTHO­RIZA­TION reicht Anmel­de­daten an WordPress weiter, etwa für Anwen­dungs­pass­wörter. Die drei Kommen­tar­zeilen schreibt WordPress in der Sprache der Website. In der offiziellen Doku­men­ta­tion stehen dieselben Regeln ohne Kommentare und ohne IfModule. Beides funk­tio­niert.

WordPress in einem Unter­ordner

Liegt WordPress etwa unter /blog/, ändern sich zwei Zeilen. Die Datei liegt dann in diesem Ordner.

RewriteBase /blog/
RewriteRule . /blog/index.php [L]

Wo die .htaccess liegt und warum Sie sie nicht sehen

Die Datei liegt im Haupt­ver­zeichnis von Word­Press. Dort finden Sie auch wp-config.php und die Ordner wp-admin, wp-content und wp-includes. Ihr Name beginnt mit einem Punkt. Solche Dateien gelten auf Linux-Servern als versteckt, und viele Programme blenden sie aus. Fehlt sie wirklich, hat das drei mögliche Gründe. Der Server ist Nginx, die Permalinks stehen auf „Einfach“, oder WordPress durfte sie nicht anlegen.

Versteckte Dateien anzeigen
  • FileZillaIm Menü Server den Punkt „Anzeige versteckter Dateien erzwingen“ wählen. FTP
  • Datei­ma­nager des HostersIn den Einstel­lungen des Datei­ma­na­gers versteckte Dateien einblenden. Hoster
  • MacIm Finder mit Cmd + Shift + Punkt versteckte Dateien zeigen. lokal
  • WindowsIm Editor beim Speichern „Alle Dateien“ wählen, sonst entsteht .htaccess.txt. lokal

Die .htaccess neu erzeugen

Ist die Datei beschädigt oder weg, legt WordPress sie selbst wieder an. Das dauert eine Minute.

  1. 1

    Die alte Datei sichern

    Laden Sie die vorhandene .htaccess per FTP herunter. Stehen darin eigene Regeln, brauchen Sie diese Kopie später.

  2. 2

    Die Permalinks speichern

    Öffnen Sie Einstel­lungen → Perma­links und klicken Sie unten auf „Änderungen speichern“. Ändern müssen Sie nichts. WordPress schreibt den Block dann neu.

    Mit der Einstellung „Einfach“ braucht WordPress keine Regeln. Dann stehen im Block nur die Kommen­tare.

  3. 3

    Keine Schreibrechte? Den Code von Hand eintragen

    Kann WordPress die Datei nicht schreiben, zeigt es einen Fehler und darunter die passenden Regeln. Kopieren Sie sie in einen Texteditor, speichern Sie die Datei als .htaccess und laden Sie sie ins Hauptverzeichnis hoch.

  4. 4

    Die Dateirechte prüfen

    Üblich ist 644: Der Besitzer darf schreiben, alle anderen nur lesen. So kann WordPress den Block pflegen, und niemand sonst ändert ihn.

  5. 5

    Eigene Regeln zurückholen und testen

    Fügen Sie Ihre eigenen Regeln aus der Sicherung wieder ein, außerhalb des WordPress-Blocks. Prüfen Sie Startseite, eine Unterseite und die Anmeldung in einem privaten Fenster.

Die .htaccess für Multisite

In einem Netzwerk schreibt WordPress die .htaccess nicht selbst. Sie tragen die Regeln von Hand ein.

WordPress zeigt den passenden Code bei der Einrichtung und später unter Netz­werk­ver­wal­tung → Einstel­lungen → Netzwerk-Einrichtung. Die Varianten unten stammen aus der offi­zi­ellen Doku­men­ta­tion.

Netzwerk mit Unter­ver­zeich­nissen (beispiel.de/seite2/)

# BEGIN WordPress Multisite
# Using subfolder network type: https://wordpress.org/documentation/article/htaccess/#multisite

RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]

# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]

# END WordPress Multisite

Netzwerk mit Subdomains (seite2.beispiel.de)

# BEGIN WordPress Multisite
# Using subdomain network type: https://wordpress.org/documentation/article/htaccess/#multisite

RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
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 Multisite

Netzwerke, die mit WordPress 3.4 oder älter einge­richtet wurden, brauchen eine ältere Variante mit einer Regel für ms-files.php. Sie steht ebenfalls in der Doku­men­ta­tion.

Eigene Regeln richtig einfügen

Alles zwischen # BEGIN WordPress und # END WordPress kann WordPress jeder­zeit über­schreiben. Schreiben Sie Ihre Regeln deshalb immer außer­halb. Weiter­lei­tungen gehören über den Block. WordPress schickt alle Adressen an index.php, Regeln darunter greifen dann nicht mehr. Manche Anleitungen raten, das Über­schreiben per Filter abzu­schalten. Das brauchen Sie nicht, wenn Ihre Regeln außer­halb stehen.

  • Vorher eine Kopie der Datei sichern
  • Eine Änderung, dann im privaten Fenster testen
  • Regeln in IfModule packen, falls ein Modul fehlt
  • Blöcke von Plugins nicht anfassen
Die rich­tige Reihen­folge
# Eigene Regeln: Weiterleitungen und Schutz
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^alte-seite/?$ /neue-seite/ [R=301,L]
</IfModule>

# BEGIN WordPress
# ... von WordPress erzeugt, nicht ändern ...
# END WordPress

# Eigene Regeln: Caching und Kompression

Weiterleitungen: HTTPS, www und einzelne Seiten

Alle Regeln gehören über den Word­Press-Block. Testen Sie im privaten Fenster, denn Browser merken sich eine 301 oft dauer­haft.

  1. 1

    HTTP auf HTTPS weiterleiten

    Leitet jeden Aufruf ohne Verschlüs­se­lung dauerhaft auf https um. Voraussetzung ist ein aktives SSL-Zertifikat beim Hoster.

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
    </IfModule>

    Stellen Sie unter Einstel­lungen → Allge­mein auch die WordPress-Adresse und die Website-Adresse auf https.

    Hinter Cloudflare oder einem anderen Proxy meldet der Server oft immer „off“. Dann entsteht eine Endlos­schleife. Viele Hoster bieten die Weiter­lei­tung auch als Schalter im Kunden­menü an.

  2. 2

    Mit oder ohne www vereinheitlichen

    Diese Regeln erledigen HTTPS gleich mit. Nutzen Sie also entweder diese oder die Regel oben, nicht beide. Ersetzen Sie beispiel.de durch Ihre Domain.

    Immer auf www

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} off [OR]
    RewriteCond %{HTTP_HOST} ^beispiel\.de$ [NC]
    RewriteRule ^(.*)$ https://www.beispiel.de/$1 [R=301,L]
    </IfModule>

    Immer ohne www

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} off [OR]
    RewriteCond %{HTTP_HOST} ^www\.beispiel\.de$ [NC]
    RewriteRule ^(.*)$ https://beispiel.de/$1 [R=301,L]
    </IfModule>

    Die Adresse unter Einstel­lungen → Allge­mein muss zur Regel passen. Sonst leiten Server und WordPress sich gegen­seitig um.

  3. 3

    Einzelne Seiten per 301 umleiten

    Der Pfad links steht ohne Domain und ohne ersten Schräg­strich. Das Ziel rechts darf auch eine vollständige Adresse sein.

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^alte-seite/?$ /neue-seite/ [R=301,L]
    RewriteRule ^leistungen/webdesign/?$ /webdesign/ [R=301,L]
    </IfModule>

    Die einfachere Schreib­weise Redirect 301 /alt/ https://www.beispiel.de/neu/ leitet auch alle Adressen unterhalb von /alt/ um. Bei vielen Umleitungen ist ein Plugin wie Redirection über­sicht­li­cher.

Mehr Sicherheit mit der .htaccess

Die Beispiele nutzen die Schreib­weise von Apache 2.4. Anleitungen mit „Order deny,allow“ stammen aus der veral­teten Version 2.2.

  1. 1

    wp-config.php und andere sensible Dateien sperren

    Die Regel stammt aus der offiziellen WordPress-Doku­men­ta­tion. Sie sperrt die Zugangs­daten, die Server­da­teien und das Fehler­pro­to­koll.

    <FilesMatch "^(wp-config\.php|\.htaccess|\.htpasswd|debug\.log)$">
      Require all denied
    </FilesMatch>

    Die Regel gilt auch für Unterordner, also etwa für wp-content/debug.log.

  2. 2

    xmlrpc.php sperren

    XML-RPC ist eine alte Schnitt­stelle und ein beliebtes Ziel für Passwort-Angriffe. Die meisten Websites brau­chen sie nicht.

    <Files xmlrpc.php>
      Require all denied
    </Files>

    Jetpack und einige Apps oder externe Dienste nutzen die Schnitt­stelle noch. Prüfen Sie danach, ob diese weiter funk­tio­nieren.

  3. 3

    Das Verzeichnislisting ausschalten

    Ohne diese Zeile zeigt der Server bei manchen Ordnern eine Liste aller Dateien an. Viele Hoster haben das bereits abge­schaltet.

    Options -Indexes

    Erlaubt der Hoster die Anweisung Options nicht, folgt ein Fehler 500. Entfernen Sie die Zeile dann wieder.

  4. 4

    PHP im Upload-Ordner verbieten

    Legen Sie im Ordner wp-content/uploads eine eigene .htaccess mit diesem Inhalt an. Dort gehören nur Bilder und Dokumente hin, keine Programme.

    <FilesMatch "\.(php|php[0-9]|phtml|phar)$">
      Require all denied
    </FilesMatch>

    Einge­schleuste PHP-Dateien im Upload-Ordner sind ein typisches Zeichen eines Angriffs. Finden Sie dort welche, lesen Sie zuerst Word­Press gehackt.

Browser-Caching und Kompression

Cache-Plugins wie WP Rocket oder LiteSpeed Cache schreiben solche Regeln oft selbst. Prüfen Sie das vorher, doppelte Regeln bringen nichts.

  1. 1

    Browser-Caching einschalten

    Der Browser speichert Bilder, Schriften, CSS und JavaScript und lädt sie beim nächsten Besuch nicht neu. Das Modul mod_expires setzt dafür die Lauf­zeit.

    <IfModule mod_expires.c>
      ExpiresActive On
      ExpiresByType image/jpeg "access plus 1 year"
      ExpiresByType image/png "access plus 1 year"
      ExpiresByType image/webp "access plus 1 year"
      ExpiresByType image/avif "access plus 1 year"
      ExpiresByType image/svg+xml "access plus 1 year"
      ExpiresByType font/woff2 "access plus 1 year"
      ExpiresByType text/css "access plus 1 month"
      ExpiresByType text/javascript "access plus 1 month"
      ExpiresByType application/javascript "access plus 1 month"
    </IfModule>

    Nach Updates von Plugins und Themes ändert sich meist die Versi­ons­nummer in der Adresse der Datei. Bearbeiten Sie eine Datei von Hand, sehen wieder­keh­rende Besucher die Änderung womöglich erst nach Ablauf der Frist.

  2. 2

    Kompression einschalten

    Das Modul mod_deflate schickt Texte gepackt. HTML, CSS und JavaScript werden dadurch deut­lich kleiner.

    <IfModule mod_deflate.c>
      AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml
      AddOutputFilterByType DEFLATE text/javascript application/javascript
      AddOutputFilterByType DEFLATE application/json application/xml image/svg+xml
    </IfModule>

    Ob sie schon wirkt, zeigen die Entwick­ler­tools des Browsers. Steht bei einer Datei content-encoding gzip oder br, ist sie aktiv.

Oft empfohlen, aber mit Vorsicht

Diese Regeln finden Sie in vielen Anlei­tungen. Sie können sinnvoll sein, haben aber Neben­wir­kungen.

Upload-Limit per php_value

Zeilen wie php_value upload_max_filesize funk­tio­nieren nur, wenn PHP als Apache-Modul läuft. Bei den meisten Hostern führen sie zum Fehler 500.

So erhöhen Sie das Upload-Limit

Passwortschutz für wp-login.php

Eine zweite Anmeldung per .htpasswd hält viele Angriffe ab. In Shops mit Kunden­konten stört sie aber die Kunden. Der Pfad zur .htpasswd muss absolut sein.

IP-Sperre für wp-admin

Geht nur mit fester IP-Adresse. Außerdem liegt dort admin-ajax.php, das viele Formulare und Plugins im Frontend brau­chen. Sperren Sie es nicht mit.

Hotlinking verhindern

Spart Daten­vo­lumen, wenn fremde Seiten Ihre Bilder einbinden. Dabei fehlen oft auch Vorschau­bilder in Feeds und sozialen Netz­werken.

Sicherheits-Header

Header wie X-Content-Type-Options sind sinn­voll. Eine Content-Security-Policy kann aber Skripte blockieren. Testen Sie sie zuerst auf einer Kopie.

Was ist ein Staging?

Autoren-Abfrage sperren

Die Sperre von ?author=1 verbirgt Benut­zer­namen nur zum Teil. Sicherer sind starke Passwörter und eine Zwei-Faktor-Anmeldung.

500 Internal Server Error nach einer Änderung

Die Website zeigt nur noch „Internal Server Error“? Dann versteht der Server eine Zeile in der .htac­cess nicht. So kommen Sie zurück.

  1. 1

    Die letzte Änderung zurücknehmen

    Ein Fehler 500 sperrt meist auch den Admin­be­reich. Öffnen Sie die .htaccess deshalb per FTP oder im Datei­ma­nager des Hosters. Laden Sie Ihre Sicherung hoch oder entfernen Sie die neuen Zeilen.

  2. 2

    Keine Sicherung? Die Datei umbenennen

    Benennen Sie die Datei in .htaccess-defekt um. Die Startseite lädt dann meist wieder, Unterseiten zeigen vorerst „nicht gefunden“. Speichern Sie danach die Permalinks, und WordPress legt eine neue Datei an.

  3. 3

    Im Fehlerprotokoll die Ursache suchen

    Das Fehler­pro­to­koll des Hosters nennt die Zeile. „Invalid command“ heißt: Das nötige Modul fehlt. „not allowed here“ heißt: Der Hoster erlaubt diese Anwei­sung nicht.

  4. 4

    Eigene Regeln einzeln wieder einfügen

    Fügen Sie eine Regel nach der anderen ein und testen Sie nach jeder. So finden Sie genau die Zeile, die den Fehler auslöst.

Alle Unterseiten zeigen 404

Der WordPress-Block fehlt oder ist beschä­digt. Speichern Sie die Perma­links erneut.

„Zu oft weitergeleitet“

Eine Weiter­lei­tung passt nicht zur Adresse in WordPress oder zum Proxy. Prüfen Sie die HTTPS- und www-Regeln.

403 bei Bildern oder Formularen

Eine Sperrregel greift zu weit, oft die im Upload-Ordner. Nehmen Sie sie test­weise heraus.

Besucher landen auf fremden Seiten

Oft nur von Google oder vom Handy aus. Dann hat meist Schadcode Regeln in die .htac­cess geschrieben.

WordPress gehackt: was jetzt
WordPress-Hilfe auch für Nicht-Kunden

Ist Ihre Website nach einer Änderung an der .htaccess nicht mehr erreichbar, bringen wir sie zurück. Wir sichern zuerst den aktuellen Stand und setzen die Regeln sauber neu.

Finden Sie Regeln, die niemand von Ihnen eingetragen hat, deutet das auf einen Angriff. Dann gilt eine andere Reihenfolge: Word­Press gehackt.

Nachricht oder Termin WordPress-Hilfe im Notfall

Fragen zur WordPress .htaccess

Wo finde ich die .htaccess in WordPress?

Im Haupt­ver­zeichnis der Instal­la­tion. Dort, wo auch wp-config.php liegt. Sie ist versteckt, weil ihr Name mit einem Punkt beginnt. Blenden Sie versteckte Dateien im FTP-Programm ein.

Brauche ich eine .htaccess, wenn mein Hoster Nginx nutzt?

Nein, Nginx liest sie nicht. Weiter­lei­tungen und Schutz­re­geln trägt dort der Hoster in die Server­kon­fi­gu­ra­tion ein. Manche Hoster setzen Nginx vor Apache, dann gilt die .htac­cess trotzdem.

Wird meine .htaccess bei Updates überschrieben?

Nur der Word­Press-Block. WordPress schreibt ihn neu, wenn Sie die Permalinks speichern oder ein Plugin die Regeln erneuert. Alles außerhalb der Markierungen bleibt erhalten.

Welche Dateirechte braucht die .htaccess?

Üblich ist 644. So darf der Besitzer schreiben und der Server lesen. Stellen Sie die Datei auf 444, kann WordPress den Block nicht mehr pflegen.

Kann ich die .htaccess mit einem Plugin bearbeiten?

Ja, aber mit Vorsicht. Manche SEO- und Sicherheits-Plugins haben einen Editor dafür. Führt eine Änderung zu Fehler 500, ist auch das Plugin nicht mehr erreichbar. Halten Sie FTP-Zugang bereit.

Serverregeln, die einfach funktionieren

Termin vereinbaren
30 Minuten am Telefon oder per Video. Sie wählen einen freien Termin im Kalender.
Nachricht schicken
Schildern Sie kurz, worum es geht. Sie bekommen innerhalb von 24 Stunden an Werktagen eine Antwort.