Die .htaccess-Datei ist eine Konfigurationsdatei für den Apache-Webserver. Sie liegt im Hauptverzeichnis einer Website (oder in einem Unterverzeichnis) und steuert, wie der Server Anfragen verarbeitet. Weiterleitungen, Passwortschutz, HTTPS erzwingen, Caching, Sicherheits-Header - all das lässt sich über die .htaccess regeln, ohne Zugriff auf die Server-Konfiguration zu benötigen.
Der Punkt vor dem Dateinamen markiert sie auf Linux-Systemen als versteckte Datei. Im FTP-Programm oder Dateimanager des Hosters muss daher die Option "Versteckte Dateien anzeigen" aktiviert sein, um sie zu sehen. Die .htaccess wird als reine Textdatei mit einem Texteditor erstellt - kein spezielles Programm nötig.
Was kann die .htaccess?
Die .htaccess-Datei wird bei jeder einzelnen Anfrage an den Server gelesen und ausgeführt. Deine Regeln gelten für das Verzeichnis, in dem sie liegt, und für alle Unterverzeichnisse. In einem Unterverzeichnis kann eine weitere .htaccess die Regeln der übergeordneten überschreiben. Die wichtigsten Einsatzbereiche:
| Einsatzgebiet | Beispiel |
|---|---|
| Weiterleitungen | Alte URL auf neue umleiten (301/302) |
| URL-Umschreibung | Saubere URLs ohne .php-Endung |
| HTTPS/www erzwingen | Alle Aufrufe auf https://www. umleiten |
| Passwortschutz | Verzeichnis mit Login schützen (htpasswd) |
| Zugriffskontrolle | IPs blockieren, Bots aussperren |
| Sicherheits-Header | XSS-Schutz, Clickjacking verhindern |
| Caching | Browser-Cache für statische Dateien |
| Komprimierung | Gzip/Deflate für schnellere Ladezeiten |
| Fehlerseiten | Eigene 404- und 403-Seiten |
301-Weiterleitungen
Die häufigste Anwendung. Eine 301-Weiterleitung teilt Suchmaschinen mit, dass eine Seite dauerhaft verschoben wurde. Die Rankings werden auf die neue URL übertragen.
Einzelne Seite umleiten
Redirect 301 /alte-seite/ https://www.beispiel.de/neue-seite/
Die einfachste Form einer Weiterleitung. Für einzelne URLs reicht das Redirect-Kommando. Der erste Pfad ist die alte URL (relativ), der zweite das vollständige Ziel.
Mit RewriteRule (flexibler)
RewriteEngine On
RewriteRule ^alte-seite/?$ /neue-seite/ [R=301,L]
RewriteRules verwenden reguläre Ausdrücke und sind damit deutlich flexibler als einfache Redirects. Das ?$ am Ende macht den abschliessenden Slash optional. [R=301,L] setzt den Statuscode 301 und beendet die Verarbeitung weiterer Regeln. Mehr dazu im Artikel PHP Redirect 301.
HTTPS und www erzwingen
Jede Website sollte ausschliesslich über HTTPS erreichbar sein. Ausserdem sollte sie sich für eine Variante entscheiden: mit oder ohne www. Die folgenden Regeln leiten alle Aufrufe auf https://www. um.
RewriteEngine On
# HTTPS erzwingen
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# www erzwingen
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Diese beiden Regeln gehören in jede .htaccess. Ohne sie ist die Website unter vier verschiedenen Adressen erreichbar (http/https, mit/ohne www) - das schadet der SEO, weil Suchmaschinen den Inhalt als Duplikat werten können. Die RewriteCond-Zeilen prüfen die Bedingung, die RewriteRule führt die Umleitung aus.
Trailing Slash erzwingen
Damit URLs immer mit einem Schrägstrich enden (beispiel.de/seite/ statt beispiel.de/seite), fügen du diese Regel hinzu:
# Trailing Slash erzwingen (nur für Nicht-Dateien)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{REQUEST_URI} !\.
RewriteRule ^(.+)$ /$1/ [R=301,L]
Die Bedingungen stellen sicher, dass nur Verzeichnis-URLs umgeleitet werden - echte Dateien (Bilder, CSS, JS) bleiben unverändert.
Passwortschutz (htpasswd)
Ein Verzeichnis lässt sich mit wenigen Zeilen per Login schützen. Dafür brauchst du zwei Dateien: die .htaccess im zu schützenden Verzeichnis und eine .htpasswd-Datei mit den Zugangsdaten.
# .htaccess im geschützten Verzeichnis
AuthType Basic
AuthName "Geschützter Bereich"
AuthUserFile /absoluter/pfad/zur/.htpasswd
Require valid-user
Der AuthUserFile-Pfad muss der absolute Serverpfad sein, nicht die URL. Bei den meisten Hostern beginnt er mit /www/htdocs/ oder /home/. Die .htpasswd-Datei enthält Benutzername und verschlüsseltes Passwort. Eine ausführliche Anleitung mit Generator, Server-Pfad-Ermittlung und Erklärung von Basic vs. Digest finden du im Artikel htpasswd Generator und Verzeichnisschutz.
Sicherheit
Die .htaccess ist ein wichtiges Werkzeug zur Absicherung einer Website. Die folgenden Regeln schützen vor den häufigsten Angriffen und sollten auf jeder Website aktiv sein.
Sicherheits-Header
# Sicherheits-Header
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-XSS-Protection "1; mode=block"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "geolocation=(), camera=(), microphone=()"
Diese Header verhindern Clickjacking (X-Frame-Options), MIME-Type-Sniffing (X-Content-Type-Options) und schränken die Weitergabe von Referrer-Daten ein. Alle modernen Browser werten diese Header aus.
Zugriff auf sensible Dateien sperren
# Sensible Dateien blockieren
<FilesMatch "(\.env|\.git|\.htpasswd|wp-config\.php|readme\.html)$">
Order Allow,Deny
Deny from all
</FilesMatch>
Diese Regel verhindert den direkten Zugriff auf Konfigurationsdateien, die Passwörter oder sensible Informationen enthalten. Besonders wichtig für WordPress-Installationen, wo die wp-config.php die Datenbank-Zugangsdaten enthält.
Verzeichnislisting deaktivieren
Options -Indexes
Ohne diese Zeile zeigt Apache den Inhalt eines Verzeichnisses an, wenn keine index.html oder index.php vorhanden ist. Das gibt Angreifern Einblick in die Dateistruktur. Eine einzelne Zeile, die auf keiner Website fehlen sollte.
WordPress absichern
WordPress bringt eine eigene .htaccess mit, die für die Permalink-Struktur zuständig ist. Diese Grundregeln sollten du dort ergänzen, um die häufigsten Angriffsvektoren zu schliessen.
wp-admin und wp-login schützen
# wp-login.php per IP einschränken
<Files wp-login.php>
Order Deny,Allow
Deny from all
Allow from 123.456.789.0
</Files>
Ersetzen du die IP-Adresse durch Deine eigene. So kann sich niemand ausser dir am Backend anmelden. Bei wechselnden IPs ist ein zusätzlicher htpasswd-Schutz auf das /wp-admin/-Verzeichnis sinnvoller.
XML-RPC deaktivieren
# XML-RPC blockieren (häufiges Angriffsziel)
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>
Die XML-RPC-Schnittstelle wird für Brute-Force-Angriffe und DDoS-Attacken missbraucht. Die meisten WordPress-Seiten brauchen sie nicht. Wer die WordPress-App oder Jetpack nutzt, sollte diese Regel nicht setzen.
WordPress-Standard .htaccess
# 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
Diese Regeln erzeugt WordPress automatisch. Die Regeln leiten alle Anfragen, die nicht auf eine existierende Datei oder ein Verzeichnis zeigen, an die index.php weiter. Eigene Regeln sollten vor dem WordPress-Block stehen, nicht darin.
Performance: Caching und Komprimierung
Zwei Massnahmen, die jede Website schneller machen: Browser-Caching für statische Dateien und Gzip-Komprimierung für Textdateien. Beides reduziert die Ladezeit deutlich und verbessert die Core Web Vitals.
Browser-Caching
# Browser-Cache für statische Dateien
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/webp "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType application/x-font-woff2 "access plus 1 year"
</IfModule>
Diese Regeln sagen dem Browser, wie lange er Dateien lokal speichern soll. Bilder und Fonts ändern sich selten und können ein Jahr gecacht werden. CSS und JavaScript bekommen einen Monat. Bei wiederholten Besuchen lädt der Browser diese Dateien nicht erneut vom Server.
Gzip-Komprimierung
# Gzip-Komprimierung
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css text/plain
AddOutputFilterByType DEFLATE application/javascript application/json
AddOutputFilterByType DEFLATE application/xml text/xml
AddOutputFilterByType DEFLATE image/svg+xml
</IfModule>
Gzip komprimiert Textdateien vor der Auslieferung. HTML, CSS und JavaScript werden dabei um 60-80% kleiner. Der Browser entpackt sie automatisch. Bilder im JPEG- und WebP-Format sind bereits komprimiert und werden nicht nochmal verkleinert.
Eigene Fehlerseiten
ErrorDocument 404 /404.html
ErrorDocument 403 /403.html
ErrorDocument 500 /500.html
Statt der Standard-Fehlermeldung des Servers zeigt Apache damit eigene HTML-Seiten an. Eine gute 404-Seite enthält eine Suchfunktion oder Links zu wichtigen Seiten und hilft dem Besucher, den gesuchten Inhalt doch noch zu finden.
.htaccess erstellen
Die .htaccess ist eine reine Textdatei ohne Dateiendung. Du erstellst sie mit einem Texteditor und per FTP oder über den Dateimanager des Hosters hochgeladen. Unter Windows gibt es beim Erstellen eine Besonderheit: Der Dateiname beginnt mit einem Punkt, was Windows standardmässig nicht erlaubt.
Die Lösung: Verwende einen Texteditor wie VS Code, Notepad++ oder Sublime Text und speichere die Datei über "Speichern unter" mit dem Namen .htaccess (mit Punkt). Im Dateityp-Dropdown wähle "Alle Dateien" statt "Textdateien". Alternativ erstelle die Datei als htaccess.txt und benenne sie nach dem Hochladen im FTP-Programm um.
Häufige Fragen
Funktioniert .htaccess auf jedem Server?
Nur auf Apache-Webservern. Nginx, der zweithäufigste Webserver, verwendet .htaccess nicht - dort wird alles über die Server-Konfiguration (nginx.conf) gesteuert. LiteSpeed, der dritte grosse Webserver, unterstützt .htaccess-Dateien weitgehend.
Wo liegt die .htaccess?
Im Hauptverzeichnis der Website (Document Root). Bei den meisten Hostern ist das /www/htdocs/, /public_html/ oder /html/. WordPress legt dort automatisch eine .htaccess an.
Meine Website zeigt einen 500 Internal Server Error
Wahrscheinlich ein Syntaxfehler in der .htaccess. Benenne die Datei per FTP um (z.B. in .htaccess_backup) und lade die Seite neu. Wenn sie wieder funktioniert, war die .htaccess der Auslöser. Prüfe den Code Zeile für Zeile und suche nach Tippfehlern, fehlenden Anführungszeichen oder nicht geladenen Modulen.
Muss ich den Server nach Änderungen neustarten?
Nein. Die .htaccess wird bei jeder Anfrage neu gelesen. Änderungen sind sofort wirksam - kein Neustart nötig.
Kann ich mehrere .htaccess-Dateien haben?
Ja. Jedes Verzeichnis kann eine eigene .htaccess haben. Die Regeln werden von oben nach unten vererbt: Die .htaccess im Hauptverzeichnis gilt überall, eine .htaccess in einem Unterverzeichnis kann diese Regeln ergänzen oder überschreiben.
Verwandte Artikel
- PHP Redirect 301 - Weiterleitung per PHP statt .htaccess
- 301-Weiterleitung und SEO - Auswirkungen auf Rankings
- HTTP auf HTTPS umleiten
- Kommentar-Spam per .htaccess blockieren
- Bilder-Hotlinking verhindern
- Dateiendung in der URL entfernen
- Slash am Ende der URL
- wp-admin absichern
Quellen
- Apache Tutorial: .htaccess files - offizielle Apache-Dokumentation
- HTTP Headers - MDN Web Docs