X-Content-Type-Options für Apache konfigurieren
Schritt-für-Schritt-Anleitung: nosniff via .htaccess und VirtualHost setzen, MIME-Types mit AddType korrekt konfigurieren und Upload-Verzeichnisse absichern.
X-Content-Type-Options auf Apache
Apache setzt den Header über das Modul mod_headers mit Header always set X-Content-Type-Options "nosniff". Die Direktive kann in .htaccess, einem Directory-Block oder direkt im VirtualHost platziert werden. Das Schlüsselwort always sorgt dafür, dass der Header auch bei Fehlerantworten (4xx, 5xx) gesendet wird.
Diese Anleitung zeigt beide Varianten — .htaccess für Shared Hosting ohne Root-Zugriff und VirtualHost für volle Kontrolle — plus MIME-Typ-Konfiguration und Upload-Schutz. Der Wolf-Agents Web Security Check prüft automatisch, ob X-Content-Type-Options: nosniff auf Ihrer Domain gesetzt ist — als Teil der 166 Prüfpunkte.
.htaccess Header setzen
Für Shared Hosting oder wenn kein direkter Apache-Konfigurationszugriff besteht, setzen Sie den Header in der .htaccess-Datei im Root-Verzeichnis. Für Server mit vollen Rechten ist die VirtualHost-Konfiguration bevorzugt — sie gilt global und kann nicht durch andere .htaccess-Dateien überschrieben werden.
# .htaccess — Variante 1: Einfachste Methode
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
# Weitere empfohlene Security-Header
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
</IfModule> # VirtualHost-Konfiguration — empfohlene Methode
<VirtualHost *:443>
ServerName ihre-domain.de
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
</IfModule>
# Korrekte MIME-Typen (RFC 9239)
AddType text/javascript .js .mjs
AddType text/css .css
AddType application/json .json
AddType font/woff2 .woff2
</VirtualHost> Falls nicht aktiv: sudo a2enmod headers && sudo systemctl restart apache2
sudo apache2ctl configtest && sudo systemctl reload apache2 Korrekte Content-Types konfigurieren
nosniff blockiert Ressourcen mit falschen Content-Types. Stellen Sie sicher, dass Apache JavaScript als text/javascript (RFC 9239) und CSS als text/css ausliefert. Die AddType-Direktive überschreibt System-Defaults und MIME-Typ-Datenbanken.
AddType-Direktiven aus dem VirtualHost-Beispiel (Schritt 1) decken bereits die kritischen Typen ab. Prüfen Sie mit curl -sI https://ihre-domain.de/app.js | grep content-type, ob text/javascript zurückgeliefert wird. application/javascript aus. Das ist veraltet (seit RFC 9239 ist text/javascript der Standard), funktioniert mit nosniff aber trotzdem — beide Typen gelten als gültig für Scripts. Upload-Schutz einrichten
Erstellen Sie eine dedizierte .htaccess im Upload-Verzeichnis, die PHP-Ausführung blockiert und alle Dateien als Download (Content-Disposition: attachment) deklariert. Das verhindert, dass hochgeladene Dateien vom Browser als aktive Ressourcen interpretiert werden.
# /uploads/.htaccess — Upload-Verzeichnis absichern
# PHP-Ausführung deaktivieren
<FilesMatch ".php[s0-9]?$">
Require all denied
</FilesMatch>
# Download erzwingen statt Browser-Rendering
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
Header always set Content-Disposition "attachment"
</IfModule>
# Script-Handler entfernen (Defense in Depth)
RemoveHandler .cgi .php .phtml .pl .py Kombinieren Sie diesen Schutz mit serverseitiger Dateivalidierung (Typ-Prüfung beim Upload) und einer separaten Domain für User-Uploads (cdn.ihre-domain.de).
Verifizierung
Testen Sie die Konfiguration mit apache2ctl configtest vor dem Reload, dann prüfen Sie den Header mit curl. Vergessen Sie nicht, auch Fehlerseiten zu testen — dafür ist das always-Keyword zuständig.
# 1. Apache-Konfiguration testen
sudo apache2ctl configtest
# 2. mod_headers prüfen
apache2ctl -M | grep headers
# 3. Apache neu laden
sudo systemctl reload apache2
# 4. Header verifizieren
curl -sI https://ihre-domain.de | grep -i x-content-type
# Erwartete Ausgabe:
# X-Content-Type-Options: nosniff Rufen Sie eine nicht existierende URL auf: curl -sI https://ihre-domain.de/nicht-vorhanden | grep -i x-content-type. Bei korrektem always-Keyword erscheint der Header auch bei der 404-Antwort.
Wie steht Ihre Domain bei X-Content-Type-Options?
Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.
Häufig gestellte Fragen
Ist mod_headers für X-Content-Type-Options auf Apache erforderlich?
Ja. Die Direktive Header always set erfordert das Apache-Modul mod_headers. Prüfen Sie mit apache2ctl -M | grep headers ob es aktiv ist. Falls nicht: sudo a2enmod headers && sudo systemctl restart apache2.
Was ist der Unterschied zwischen "Header set" und "Header always set"?
Header set setzt den Header nur bei erfolgreichen Antworten (2xx). Header always set setzt ihn bei allen Antworten — auch bei Fehlerseiten (4xx, 5xx). Für Security-Header immer "always" verwenden, damit die Schutzheader auch bei 404-Seiten aktiv sind.
Kann ich den Header in .htaccess oder nur in der VirtualHost-Konfiguration setzen?
.htaccess ist möglich, wenn AllowOverride AuthConfig | FileInfo | All für das Verzeichnis gesetzt ist. Die bevorzugte Methode ist der VirtualHost-Block in der Apache-Konfiguration — er wird serverseitig verwaltet, gilt global und ist nicht durch Nutzer überschreibbar.
Wie setze ich korrekte Content-Types für JavaScript in Apache?
AddType text/javascript .js .mjs in der VirtualHost-Konfiguration oder .htaccess. Alternativ in der Datei /etc/mime.types anpassen. Seit Apache 2.4 ist text/javascript bereits als korrekter Typ für .js-Dateien eingetragen — prüfen Sie trotzdem, ob Ihre Version aktuell ist.
Wie verhindere ich PHP-Ausführung im Upload-Verzeichnis?
Erstellen Sie eine .htaccess im Upload-Verzeichnis mit: php_flag engine off (PHP als Apache-Modul) oder RemoveHandler .php .phtml (alle PHP-Handler entfernen). Kombiniert mit Header always set Content-Disposition "attachment" werden Uploads als Downloads behandelt, nicht als aktive Ressourcen.