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.

Apache · Schritt für Schritt

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.

1 Schritt 1 von 4

.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 (Root-Verzeichnis) mod_headers
# .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>
/etc/apache2/sites-available/ihre-domain.conf VirtualHost
# 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>
mod_headers aktivieren

Falls nicht aktiv: sudo a2enmod headers && sudo systemctl restart apache2

Apache testen und neu laden:
sudo apache2ctl configtest && sudo systemctl reload apache2
2 Schritt 2 von 4

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.

Die 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.
Ältere Apache-Versionen und manche Hosting-Provider liefern JavaScript noch als 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.
3 Schritt 3 von 4

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-Schutz
# /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
Defense in Depth

Kombinieren Sie diesen Schutz mit serverseitiger Dateivalidierung (Typ-Prüfung beim Upload) und einer separaten Domain für User-Uploads (cdn.ihre-domain.de).

4 Schritt 4 von 4

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.

Terminal Verifizierung
# 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
Auch Fehlerseiten prüfen

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.