Spaces. Smartes Cloud Hosting für anspruchsvolle Webprojekte. Loslegen und Spaces testen. Von Mittwald.
Andreas Hecht 20. März 2019

Du kummst hier net rein: die 8 nützlichsten .htaccess-Tricks für WordPress

Die .htac­cess Datei ist ein mäch­ti­ges Konfigurationswerkzeug für dei­nen Webserver oder dein Webhosting-Paket. Du soll­test es grund­sätz­lich für das Selbsthosting von WordPress nut­zen und kon­se­quent anwen­den. In die­sem Beitrag zei­ge ich dir, wel­che Grundeinstellungen in die­se Datei gehö­ren, damit WordPress siche­rer und bes­ser wird.

Nützliche .htaccess Tricks

Die Vorbereitung

Zuerst ein­mal muss die Datei gefun­den wer­den. Der fol­gen­de Screenshot zeigt, wo die Datei liegt. Regelmäßig soll­te sie sich im Hauptverzeichnis dei­ner WordPress-Installation fin­den las­sen, also dort, wo die Ordner wp-con­tent, wp-admin usw. lie­gen.

Der Speicherort der .htaccess-Datei

Ganz wich­tig ist es, vor dem Bearbeiten der .htac­cess Datei ein Backup sel­bi­ger zu erstel­len. Dazu kopie­re die Datei ein­fach in einen neuen/anderen Ordner.

Eine Besonderheit unter Mac OS X: Der Mac sieht alle Dateien mit einem Punkt vor dem Dateinamen als Systemdateien an, also auch die .htac­cess. Das bedeu­tet, dass er sie aus­blen­det, sobald du sie etwa auf den Desktop gezo­gen hast. Abhilfe schafft hier das klei­ne Dashboard Widget Hidden Files, mit dem man nach Belieben die ver­steck­ten Dateien ein- und wie­der aus­blen­den kann.

Nach jeder Änderung an der .htac­cess-Datei muss ein Refresh des Browsers durch­ge­führt wer­den, um fest­stel­len zu kön­nen, ob die Webseite noch erreich­bar ist. Schon bei nur einem feh­ler­haf­ten Zeichen wird die betref­fen­de Webseite nicht mehr ange­zeigt wer­den. Die .htac­cess ist sehr emp­find­lich. Sollte dei­ne Webseite also nicht mehr dar­stell­bar sein, lade bit­te die Backup-Version wie­der hoch. Das behebt den Fehler zumeist augen­blick­lich.

Die nun fol­gen­den Code-Schnipsel füge bit­te ein­fach an das Ende der .htac­cess an.

1. Zugriff von außen auf .htaccess Datei verbieten

Damit die wich­ti­ge Serversteuerungs-Datei .htac­cess kei­nes­falls von außer­halb des (S)FTP Zugangs erreich­bar und damit ver­än­dert wer­den kann, ver­bie­ten wir als ers­tes den Zugriff dar­auf.

# Zugriff auf .htaccess und .htpasswd verbieten, falls in Benutzung
<FilesMatch "(\.htaccess)">
  Order deny,allow
  Deny from all
</FilesMatch>

2. Bild-Hotlinking verbieten

Das soge­nann­te Hotlinking von Bildern kann zum ech­ten Problem wer­den. Hierbei laden ande­re Menschen die Bilder aus dei­ner Webseite nicht her­un­ter, um sie dann anschlies­send zu ver­lin­ken, son­dern es wird nur der Pfad zu dei­nem Bild ange­ge­ben. Dies kann dei­ne Webseite ver­lang­sa­men und wich­ti­ge Bandbreite steh­len. Die exter­ne Verlinkung der Bilder kannst du mit dem fol­gen­den Code jedoch ganz leicht ver­hin­dern.

Der Platzhalter deinewebseite.com muss durch die URL dei­ner Webseite ersetzt wer­den. Ganz unten ist der Pfad zu einer Grafik zu fin­den, die anstatt des ver­link­ten Bildes ange­zeigt wird. Diese Grafik kann durch jede ande­re ersetzt wer­den.

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?deinewebseite.com [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?deinewebseite.com [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ http://i.imgur.com/g7ptdBB.png [NC,R,L]

Bitte beach­ten: Solltest du einen exter­nen Feedanbieter, wie zum Beispiel Feedburner, benut­zen, könn­te es sein, dass kei­ne Bilder im Feed lan­den.

3. Browser-Caching aktivieren

Kaum eine ande­re Tuning-Maßnahme bringt mit so wenig Aufwand so viel Ergebnis. Viele der größ­ten Dateien dei­ner Webseite ändern sich im Grunde genom­men nie. Deshalb ist es eine gute Idee, die­se für eine lan­ge Zeit in den Browser-Cache zu beför­dern. Dateien, wie zum Beispiel das CSS oder das JavaScript einer Webseite, wer­den dann nur beim ers­ten Besuch ein­mal vom Browser gela­den. Bei jedem wei­te­ren Besuch (oder aber auch beim Aufruf wei­te­rer Seiten beim ers­ten Besuch) muss der Browser die­se Dateien nicht mehr laden. Dementsprechend wird die Webseite viel schnel­ler ange­zeigt.

## EXPIRES CACHING ##
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType image/gif "access 1 year"
ExpiresByType image/png "access 1 year"
ExpiresByType text/css "access 1 month"
ExpiresByType text/html "access 1 month"
ExpiresByType application/pdf "access 1 month"
ExpiresByType text/x-javascript "access 1 month"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresByType image/x-icon "access 1 year"
ExpiresDefault "access 1 month"
</IfModule>
## EXPIRES CACHING ##

4. IP-Adressen dauerhaft bannen

Es kann schon mal vor­kom­men, dass man spe­zi­el­le IP-Adressen ein­fach ban­nen möch­te. Sei es, weil der­je­ni­ge ver­sucht hat, den Administrationsbereich zu hacken, oder aber, weil er viel­leicht nur bös­wil­li­ge (Spam) Kommentare hin­ter­lässt. Wenn du die IP-Adresse des­je­ni­gen her­aus­ge­fun­den hast, nut­ze fol­gen­den Code um ihn für immer, zumin­dest unter die­ser IP-Adresse, aus­zu­sper­ren.

<Limit GET POST>
order allow,deny
deny from 123.456.78.9
deny from 987.654.32.1
allow from all
</Limit>

Bitte beach­ten: Die IP-Adressen im obi­gen Code müs­sen natür­lich noch ange­passt wer­den. Diese Änderung gehör­te einst­mals zum Standard-Repertoire, ist jedoch mit Inkrafttreten der DSGVO deut­lich schwie­ri­ger umzu­set­zen, da du IP-Adressen nicht mehr stan­dard­mä­ßig erfas­sen darfst.

5. Include-Only-Dateien blocken

Etliche, wirk­lich wich­ti­ge Dateien soll­ten nie­mals zugäng­lich sein, außer von WordPress selbst. Auch davor kann man sich mit fol­gen­dem Code schüt­zen.

Bitte beach­ten: Für eine WordPress-Multisite-Installation funk­tio­niert der Code nicht.

# Block the include-only files.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
</IfModule>

 6. Separate Htaccess schützt den Wp-Content-Ordner

Der WordPress Ordner wp-con­tent ist der wich­tigs­te Ordner, da er deineThemes, die Plugins und Bilder, gecach­te Dateien usw. ent­hält. Für Hacker ist die­ser Ordner das Hauptangriffsziel, des­halb soll­te er gut geschützt sein.

Erstelle eine sepa­ra­te .htac­cess Datei, füge den fol­gen­den Code hin­ein und lade die Datei in den wp-con­tent Ordner hoch (www.deinewebseite/wp-content/).

Order deny,allow
 Deny from all
 <Files ~ ".(xml|css|jpe?g|png|gif|js)$">
 Allow from all
 </Files>

7. Die XML-RPC Schnittstelle abschalten

Die XML-RPC Schnittstelle in WordPress dient dazu, WordPress mit exter­nen Programmen ver­wal­ten zu kön­nen; zum Beispiel, um Artikel zu ver­öf­fent­li­chen oder Kommentare zu bear­bei­ten. Zu den Programmen gehö­ren unter ande­rem die mobi­len Anwendungen für iOS, Android und Co, aber auch die WordPress-Desktopanwendung.

Die Schnittstelle kann aber auch für DDoS-Angriffe genutzt wer­den, die dafür sor­gen, dass dei­ne Webseite lahm gelegt wird. Mit einem kur­zen Eintrag in die .htac­cess schal­test du die Schnittstelle kom­plett ab:

<Files xmlrpc.php>
  Order Deny,Allow
  Deny from all
</Files>

Diesen Eintrag soll­test du aller­dings nur ver­wen­den, wenn dei­ne Webseite kei­ne Blog-Funktionalität hat, da auch kei­ne Trackbacks mehr durch gelas­sen wer­den. Solltest du einen Blog betrei­ben oder dein WordPress mit mobi­len Anwendungen betrei­ben wol­len, nut­ze den fol­gen­den Code, um die Schnittstelle abzu­si­chern:

<IfModule mod_setenvif.c>
  <Files xmlrpc.php>
    BrowserMatch "Poster" allowed
    BrowserMatch "WordPress" allowed
    BrowserMatch "wp-iphone" allowed
    BrowserMatch "wp-android" allowed
    Order Deny,Allow
    Deny from All
    Allow from env=allowed
  </Files>
</IfModule>

Im Beispiel-Code sind Zeile für Zeile fol­gen­de Clients frei­ge­ge­ben:

  • Poster
  • WordPress-Blogs
  • WordPress for iOS
  • WordPress for Android

Nicht benö­tig­te Freigaben gehö­ren zei­len­wei­se ent­fernt. Neue User-Agents kön­nen hin­zu­ge­fügt und somit frei­ge­schal­tet wer­den.

8. PHP – Fehlermeldungen unterdrücken

Dies ist ein ganz wich­ti­ger Punkt, denn sobald PHP eine Fehlermeldung her­aus gibt, wird damit auch der Dateipfad sicht­bar. Sergej Müller schreibt zu die­sem Problem:

In WordPress-Blogs ist es recht sim­pel, einen PHP-Fehler (indi­rekt) zu erzeu­gen, um an die Fehler-Ausgabe inklu­si­ve Pfad her­an zu kom­men. Dafür muss man weder Administrator noch Experte sein. Durch einen direk­ten Aufruf bestimm­ter WordPress-Core- wie Plugins-Dateien in der Adresszeile des Browsers wer­den PHP-Fatal-Fehler gene­riert (weil not­wen­di­ge und refe­ren­zier­te WordPress-Funktionen fehlen).Erlauben Server- bzw. PHP-Einstellungen die Darstellung von Fehlern, erschei­nen Fehler der Anwendung im Browser. Kaum jemand kann etwas mit der Fehlerausgabe anfan­gen, für Angreifer ist es jedoch eine sehr wert­vol­le Information, um nach Hintertüren zu suchen und die­se aus­zu­nut­zen.

Mit einem simp­len Eintrag in der .htac­cess Datei löst du das Problem:

php_flag display_errors Off

Zugabe – denn Sicherheit geht über alles

Blocken wir nun den Zugriff von außen auf wich­ti­ge Dateien, denn schließ­lich soll­test nur du Zugriff auf die­se Dateien haben. Der unte­re Punkt schützt dei­ne Webseite zusätz­lich gegen URL-Exploits, also gegen Hackversuche über die URL. Dieser Code befin­det sich in jeder .htac­cess Datei mei­ner Webseiten.

# ----------------------------------------------------------------------
# Wichtige Sicherheitseinstellungen
# ----------------------------------------------------------------------	

#wichtige Dateien gegen Zugriff von außen blocken
<files install.php>
Order allow,deny
Deny from all
</files>

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

# PROTECT readme.html
<files readme.html>
 Order Allow,Deny
 Deny from all
 Satisfy all
</Files>

# PROTECT liesmich.html für DE Edition
<Files liesmich.html>
 Order Allow,Deny
 Deny from all
 Satisfy all
</Files>

<files error_log>
Order allow,deny
Deny from all
</files>

# Keine URL-based Exploits zulassen
RedirectMatch 403 \[
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
# Double slashes in allen URLs verbieten
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /(([^/\ ]+/)*)/+([^\ ]*)
RewriteRule ^ /%1%3 [L,R=301]
</IfModule>

Fazit

Mit nur ein paar Minuten Zeitaufwand machst du mit dem Code die­ses Artikels dei­ne WordPress-Webseite wesent­lich siche­rer und sogar schnel­ler. Hacker haben jetzt bedeu­tend weni­ger Chancen, dei­ne Webseite zu kom­pro­mit­tie­ren und dei­ne Leser wird es freu­en, dass die Webseite durch das Aktivieren von Browser-Caching schnel­ler gewor­den ist.

(Der Beitrag erschien erst­mals im Dezember 2014 und wird seit­dem aktu­ell gehal­ten. Das letz­te Update erfolg­te am 20.03.2019.)

(Beitragsbild: Depositphotos)

Andreas Hecht

Andreas Hecht

entwickelt WordPress-Websites und bietet dir einen Website Sicherheit Service und einen Performance Service für deine Website. Außerdem ist er Spezialist für Onpage SEO und bringt Deine Website in die Top-Suchergebnisse von Google. Auf seinem Blog schreibt er über WordPress, SEO und Content SEO.

7 Kommentare

  1. Hallo und vie­len Dank! Habe 7 Tipps davon erfolg­reich umge­setzt.

    Leider erhal­te ich bei
    # PHP – Fehlermeldungen unter­drü­cken
    php_flag display_errors Off

    einen 500 inter­nal ser­ver error.

    Sobald ich die Zeile in der .htac­cess aus­kom­men­tie­re, funk­tio­niert alles. (Zumindest habe ich bis­her kei­ne wei­te­ren Fehler ent­deckt ..)

    Feli

    • @Feli: Bei mir war’s das Gleiche. Ich wür­de den Support des Webhosts kon­tak­tie­ren und die bes­te Methode erfra­gen, um die PHP-Fehlermeldung zu deak­ti­vie­ren. Bei mei­nem Host, DomainFactory, lässt sich das z. B. errei­chen, indem man im Kundenmenü die Konfigurationsdatei php.ini erstellt und dar­in die Fehlermeldung abschal­tet. Eine Sache von fünf Minuten. Die loh­nen sich – ich habe auf einer mei­ner WP-Sites tat­säch­lich schon mit­be­kom­men, dass ein Schnüffler mit­tels PHP-Fehlermeldung den Pfad her­aus­ge­fun­den hat.

  2. Oft ist es sinn­voll, statt einer ein­zel­nen IP bes­ser gleich die gesam­te IP-Range eines Providers zu sper­ren (auf “Besuch” aus Russland oder der Ukraine kön­nen die Meisten wohl ver­zich­ten).

    In die­sem Fall erweist sich das Sperren über CIDR (Classless Inter Domain Routing) als nütz­lich, z.B.:

    deny from 188.143.128.0/17 #Russian Federation
    deny from 94.154.192.0/18 #Ukraine

  3. Separate Htaccess schützt den Wp-Content-Ordner”

    Nach hin­zu­fü­gen die­ser Datei in mei­nen Content Ordner, wur­den eini­ge Icons und die Schriftarten auf mei­ner Webseite nicht mehr gela­den.
    Habe des­halb die­se .htac­ces wie­der ent­fernt

  4. Perfekt zusam­men­ge­fasst, vie­len Dank. Konnte ich gera­de direkt so umset­zen.

  5. Options -Indexes
    fehlt noch für die htac­cess

Schreibe einen Kommentar zu rpzine Antworten abbrechen

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