Die .htaccess
-Datei ist ein mächtiges Werkzeug in deiner WordPress-Installation. Mit ihr kannst du die Sicherheit erhöhen, die Performance verbessern und viele weitere wichtige Einstellungen vornehmen. In diesem Beitrag werden wir die wichtigsten Konfigurationen erläutern, die du in deiner .htaccess
-Datei nutzen kannst, um deine Website zu optimieren.
*Update 20.07.2024
Grundlegende Konfiguration
Standard WordPress .htaccess
Beginnen wir mit der Standard-WordPress .htaccess
-Datei. Diese ist für die Permalink-Struktur deiner Website verantwortlich.
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
- RewriteEngine On: Aktiviert das Umschreiben von URLs.
- RewriteBase /: Setzt den Basis-Pfad für alle nachfolgenden Regeln.
- RewriteRule ^index.php$ – [L]: Wenn die Anfrage an
index.php
geht, tue nichts und beende die Verarbeitung dieser Regel. - RewriteCond %{REQUEST_FILENAME} !-f: Wenn die angeforderte Datei nicht existiert.
- RewriteCond %{REQUEST_FILENAME} !-d: Wenn das angeforderte Verzeichnis nicht existiert.
- RewriteRule . /index.php [L]: Leite alle anderen Anfragen an
index.php
weiter.
Diese Regeln sorgen dafür, dass die Permalinks korrekt funktionieren, indem sie alle Anfragen, die nicht zu einer existierenden Datei oder einem Verzeichnis führen, an index.php
weiterleiten.
Sicherheitseinstellungen
Verzeichnisschutz
Schütze sensible Verzeichnisse vor unbefugtem Zugriff.
# Verzeichnisschutz für wp-config.php und .htaccess
<Files wp-config.php>
Order Allow,Deny
Deny from all
</Files>
<Files .htaccess>
Order Allow,Deny
Deny from all
</Files>
- <Files wp-config.php>: Beginnt eine Regel, die auf die Datei
wp-config.php
angewendet wird. - Order Allow,Deny: Gibt die Reihenfolge an, in der Zugriffsregeln angewendet werden.
- Deny from all: Verweigert allen Zugriff auf diese Datei.
Schutz vor Directory Browsing
Verhindere, dass Besucher die Verzeichnisstruktur deiner Website einsehen können.
# Verhindere Directory Browsing
Options -Indexes
- Options -Indexes: Deaktiviert die automatische Auflistung des Verzeichnisinhalts, wenn keine Index-Datei vorhanden ist.
Schutz vor schadhaften Abfragen
Blockiere schadhafte Abfragen, die versuchen, Sicherheitslücken auszunutzen.
# Schutz vor schadhaften Abfragen
<IfModule mod_rewrite.c>
RewriteCond %{QUERY_STRING} (\|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} (\|%3C) [NC,OR]
RewriteCond %{QUERY_STRING} (base64_encode)(.*) (\\|%3D)(.*) [NC,OR]
RewriteCond %{QUERY_STRING} (eval\() [NC,OR]
RewriteCond %{QUERY_STRING} (system\() [NC,OR]
RewriteCond %{QUERY_STRING} (passthru\() [NC,OR]
RewriteCond %{QUERY_STRING} (shell_exec\() [NC,OR]
RewriteCond %{QUERY_STRING} (phpinfo\() [NC,OR]
RewriteCond %{QUERY_STRING} (popen\() [NC,OR]
RewriteCond %{QUERY_STRING} (proc_open\() [NC]
RewriteRule ^(.*)$ - [F,L]
</IfModule>
- RewriteCond: Bedingung für die Rewrite-Regel. Hier wird nach bestimmten Zeichenfolgen in der URL gesucht, die oft in schädlichen Abfragen vorkommen.
- RewriteRule: Wenn eine der Bedingungen zutrifft, wird die Anfrage abgelehnt (
[F,L]
bedeutet „forbidden“ und „last rule“).
Verhindern von Code-Ausführung in Uploads-Verzeichnissen
Verhindere die Ausführung von PHP-Dateien im Uploads-Verzeichnis, um die Sicherheit zu erhöhen.
# Verhindere Ausführung von PHP-Dateien im Uploads-Verzeichnis
<Directory "/var/www/html/wp-content/uploads">
<Files "*.php">
Deny from all
</Files>
</Directory>
- <Directory „/path/to/uploads“>: Wendet die Regel auf das angegebene Verzeichnis an.
- <Files „*.php“>: Wendet die Regel auf alle PHP-Dateien an.
- Deny from all: Verweigert allen Zugriff auf diese Dateien.
Performance-Optimierungen
Browser Caching
Nutze Browser Caching, um die Ladezeiten deiner Website zu verbessern.
# Browser Caching
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/pdf "access plus 1 month"
ExpiresByType text/x-javascript "access plus 1 month"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 year"
ExpiresDefault "access plus 2 days"
</IfModule>
- ExpiresActive On: Aktiviert die Ablaufsteuerung.
- ExpiresByType: Setzt Ablaufzeiten für verschiedene Dateitypen.
- ExpiresDefault: Setzt die Standard-Ablaufzeit.
GZIP-Komprimierung
Aktiviere GZIP-Komprimierung, um die Größe deiner HTML, CSS und JS Dateien zu reduzieren.
# GZIP-Komprimierung
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/css text/javascript application/javascript application/x-javascript application/rss+xml application/atom+xml application/x-httpd-php application/x-httpd-fastphp application/x-httpd-eruby application/x-httpd-eruby-rhtml
</IfModule>
- AddOutputFilterByType DEFLATE: Aktiviert die Komprimierung für die angegebenen Dateitypen.
Cache-Control Header
Setze Cache-Control Header, um dem Browser mitzuteilen, wie lange er bestimmte Dateitypen cachen soll.
# Cache-Control Header
<IfModule mod_headers.c>
<FilesMatch "\.(ico|jpe?g|png|gif|swf)$">
Header set Cache-Control "max-age=31536000, public"
</FilesMatch>
<FilesMatch "\.(css|js)$">
Header set Cache-Control "max-age=31536000"
</FilesMatch>
<FilesMatch "\.(html|htm)$">
Header set Cache-Control "max-age=600"
</FilesMatch>
</IfModule>
- Header set Cache-Control: Setzt den Cache-Control Header für die angegebenen Dateitypen.
- max-age: Gibt die maximale Zeit in Sekunden an, für die der Inhalt im Cache bleiben soll.
URL-Weiterleitungen
301 Weiterleitungen
Nutze 301-Weiterleitungen, um Besucher und Suchmaschinen auf eine neue URL zu leiten, wenn sich die Adresse deiner Seite geändert hat.
# 301 Weiterleitungen
Redirect 301 /alte-seite.html http://www.deineseite.de/neue-seite.html
- Redirect 301: Leitet eine alte URL dauerhaft auf eine neue URL um.
HTTPS erzwingen
Erzwinge die Verwendung von HTTPS, um die Sicherheit deiner Website zu erhöhen.
# HTTPS erzwingen
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
- RewriteCond %{HTTPS} !=on: Prüft, ob die Anfrage nicht über HTTPS erfolgt.
- RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]: Leitet alle Anfragen auf die HTTPS-Version der Seite um.
Content Security Policy (CSP)
CSP Header setzen
Setze Content Security Policy Header, um die Sicherheit deiner Website zu verbessern und Angriffe zu verhindern.
# Content Security Policy
<IfModule mod_headers.c>
Header set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:"
</IfModule>
- Header set Content-Security-Policy: Setzt die Content Security Policy Header.
- default-src ’self‘: Erlaubt Standardinhalte nur von der eigenen Domain.
- script-src ’self‘ ‚unsafe-inline‘: Erlaubt Skripte nur von der eigenen Domain und Inline-Skripte (letzteres sollte vermieden werden, wenn möglich).
- style-src ’self‘ ‚unsafe-inline‘: Erlaubt Stile nur von der eigenen Domain und Inline-Stile.
- img-src ’self‘ data:: Erlaubt Bilder nur von der eigenen Domain und als Data-URLs.
- font-src ’self‘ data:: Erlaubt Schriftarten nur von der eigenen Domain und als Data-URLs.
Weitere nützliche Einstellungen
Hotlinking verhindern
Verhindere, dass andere Websites deine Bilder direkt verlinken und damit deinen Server belasten.
# Hotlinking verhindern
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?deineseite\.com [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]
</IfModule>
- RewriteCond %{HTTP_REFERER} !^$: Erlaubt direkte Anfragen ohne Referer.
- RewriteCond %{HTTP_REFERER} !^http://deineseite.com [NC]: Erlaubt Anfragen nur von der eigenen Domain.
- RewriteRule .(jpg|jpeg|png|gif)$ – [NC,F,L]: Blockiert Anfragen nach Bildern, die diese Bedingungen nicht erfüllen.
XML-RPC deaktivieren
Deaktiviere XML-RPC, um Brute-Force-Angriffe zu verhindern.
# XML-RPC deaktivieren
<Files xmlrpc.php>
order deny,allow
deny from all
</Files>
- <Files xmlrpc.php>: Wendet die Regel auf die Datei
xmlrpc.php
an. - deny from all: Verweigert allen Zugriff auf diese Datei.
Fehlermeldungen anpassen
Passe die Fehlermeldungen an, die Besucher sehen, wenn sie auf eine Seite stoßen, die nicht existiert.
# Anpassung der Fehlermeldungen
ErrorDocument 404 /404.html
ErrorDocument 403 /403.html
ErrorDocument 500 /500.html
- ErrorDocument 404 /404.html: Leitet Besucher auf eine benutzerdefinierte 404-Fehlerseite weiter.
- ErrorDocument 403 /403.html: Leitet Besucher auf eine benutzerdefinierte 403-Fehlerseite weiter.
- ErrorDocument 500 /500.html: Leitet Besucher auf eine benutzerdefinierte 500-Fehlerseite weiter.
Zugriff auf bestimmte IPs beschränken
Erlaube den Zugriff auf bestimmte Verzeichnisse nur von bestimmten IP-Adressen.
# Zugriff auf bestimmte IPs beschränken
<Directory "/var/www/html/wp-admin">
Order Deny,Allow
Deny from all
Allow from 123.456.789.000
</Directory>
- <Directory „/path/to/admin“>: Wendet die Regel auf das angegebene Verzeichnis an.
- Deny from all: Verweigert allen Zugriff.
- Allow from 123.456.789.000: Erlaubt den Zugriff nur von der angegebenen IP-Adresse.
Beispiel einer gut ausgewogenen .htaccess Datei
Hier ist eine gut ausgewogene .htaccess Datei, die sowohl die Sicherheit erhöht als auch die Performance verbessert:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
# Verzeichnisschutz für wp-config.php und .htaccess
<Files wp-config.php>
Order Allow,Deny
Deny from all
</Files>
<Files .htaccess>
Order Allow,Deny
Deny from all
</Files>
# Verhindere Directory Browsing
Options -Indexes
# Schutz vor schadhaften Abfragen
<IfModule mod_rewrite.c>
RewriteCond %{QUERY_STRING} (\|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} (\|%3C) [NC,OR]
RewriteCond %{QUERY_STRING} (base64_encode)(.*) (\\|%3D)(.*) [NC,OR]
RewriteCond %{QUERY_STRING} (eval\() [NC,OR]
RewriteCond %{QUERY_STRING} (system\() [NC,OR]
RewriteCond %{QUERY_STRING} (passthru\() [NC,OR]
RewriteCond %{QUERY_STRING} (shell_exec\() [NC,OR]
RewriteCond %{QUERY_STRING} (phpinfo\() [NC,OR]
RewriteCond %{QUERY_STRING} (popen\() [NC,OR]
RewriteCond %{QUERY_STRING} (proc_open\() [NC]
RewriteRule ^(.*)$ - [F,L]
</IfModule>
# Verhindere Ausführung von PHP-Dateien im Uploads-Verzeichnis
<Directory "/var/www/html/wp-content/uploads">
<Files "*.php">
Deny from all
</Files>
</Directory>
# Browser Caching
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/pdf "access plus 1 month"
ExpiresByType text/x-javascript "access plus 1 month"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 year"
ExpiresDefault "access plus 2 days"
</IfModule>
# GZIP-Komprimierung
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/css text/javascript application/javascript application/x-javascript application/rss+xml application/atom+xml application/x-httpd-php application/x-httpd-fastphp application/x-httpd-eruby application/x-httpd-eruby-rhtml
</IfModule>
# Cache-Control Header
<IfModule mod_headers.c>
<FilesMatch "\.(ico|jpe?g|png|gif|swf)$">
Header set Cache-Control "max-age=31536000, public"
</FilesMatch>
<FilesMatch "\.(css|js)$">
Header set Cache-Control "max-age=31536000"
</FilesMatch>
<FilesMatch "\.(html|htm)$">
Header set Cache-Control "max-age=600"
</FilesMatch>
</IfModule>
# HTTPS erzwingen
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
# Content Security Policy
<IfModule mod_headers.c>
Header set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:"
</IfModule>
# Hotlinking verhindern
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?deineseite\.com [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]
</IfModule>
# XML-RPC deaktivieren
<Files xmlrpc.php>
order deny,allow
deny from all
</Files>
# Anpassung der Fehlermeldungen
ErrorDocument 404 /404.html
ErrorDocument 403 /403.html
ErrorDocument 500 /500.html
# Zugriff auf bestimmte IPs beschränken
<Directory "/var/www/html/wp-admin">
Order Deny,Allow
Deny from all
Allow from 123.456.789.000
</Directory>
Sicherheit- und Performance-Optimierungen sollten als gute Basis für jede WordPress-Installation dienen. Passe die Datei an deine spezifischen Anforderungen an und mache regelmäßig Backups, um sicherzustellen, dass deine Website sicher und effizient bleibt.
Auch spannend: Die wp-config.php – Das Herzstück deiner WordPress Installation