X-Content-Type-Options für Caddy konfigurieren
Schritt-für-Schritt-Anleitung: nosniff via Caddyfile header-Direktive setzen, globale Snippets für mehrere Sites und Upload-Verzeichnisse absichern.
X-Content-Type-Options in Caddy
Caddy ist bekannt für seine klare Konfigurationssyntax — Security-Header sind in einer Zeile gesetzt: header X-Content-Type-Options "nosniff". Das Caddyfile-Snippet-System ermöglicht die Wiederverwendung von Header-Konfigurationen über mehrere Sites hinweg.
Caddy erkennt MIME-Typen für statische Dateien automatisch — für die meisten Sites ist kein zusätzliches MIME-Typ-Tuning nötig. Diese Anleitung zeigt die einfache Konfiguration, globale Snippets und den Upload-Schutz.
Caddyfile Header
Die header-Direktive in Caddy setzt Response-Header für alle Anfragen an den Site-Block. Sie kann direkt im Site-Block oder in einem wiederverwendbaren Snippet definiert werden. Das Snippet-Pattern ist empfohlen, wenn Sie mehrere Sites oder Subdomains betreiben.
# Caddyfile — Einfachste Konfiguration
ihre-domain.de {
# X-Content-Type-Options: MIME-Sniffing verhindern
header X-Content-Type-Options "nosniff"
# Weitere empfohlene Security-Header
header X-Frame-Options "SAMEORIGIN"
header Referrer-Policy "strict-origin-when-cross-origin"
# Anwendung (als Beispiel: Reverse Proxy)
reverse_proxy localhost:3000
} # Wiederverwendbares Security-Header-Snippet
(security_headers) {
header X-Content-Type-Options "nosniff"
header X-Frame-Options "SAMEORIGIN"
header Referrer-Policy "strict-origin-when-cross-origin"
header X-XSS-Protection "0"
}
# Verwendung in mehreren Sites
ihre-domain.de {
import security_headers
file_server
}
api.ihre-domain.de {
import security_headers
reverse_proxy localhost:4000
} caddy validate --config /etc/caddy/Caddyfile && sudo systemctl reload caddy MIME-Typen in Caddy
Caddy erkennt MIME-Typen für statische Dateien automatisch aus Dateiendungen. Für .js-Dateien wird text/javascript korrekt gesetzt, für .css entsprechend text/css. Für Sonderfälle oder dynamisch generierte Inhalte können Sie den Content-Type explizit überschreiben.
curl -sI https://ihre-domain.de/app.js | grep content-type, ob Caddy text/javascript zurückliefert. Falls Sie noch application/javascript sehen (veraltet seit RFC 9239), können Sie es mit header /app.js Content-Type "text/javascript" korrigieren. Bei Caddy als Reverse Proxy bestimmt der Upstream-Server die Content-Types. Caddy leitet sie unverändert weiter. Nutzen Sie header_down innerhalb eines reverse_proxy-Blocks, um upstream Content-Types zu überschreiben.
Upload-Pfade absichern
Für Upload-Verzeichnisse definieren Sie einen spezifischen handle /uploads/*-Block mit Content-Disposition: attachment und explizitem nosniff-Header. Der handle-Block übernimmt alle Anfragen für den Pfad und deklariert alle Dateien als Downloads.
# Upload-Verzeichnis absichern
ihre-domain.de {
header X-Content-Type-Options "nosniff"
# Upload-Pfad: Download erzwingen
handle /uploads/* {
header X-Content-Type-Options "nosniff"
header Content-Disposition "attachment"
file_server
}
# Alle anderen Routen normal behandeln
handle {
reverse_proxy localhost:3000
}
} handle-Blöcke in Caddy schließen sich gegenseitig aus (erster Match gewinnt). Das Muster handle /uploads/* {...} gefolgt von handle {...} ist das empfohlene Pattern für pfad-spezifische Konfigurationen.
Verifizierung
Caddy bietet den Befehl caddy validate zur Syntaxprüfung vor dem Reload. Nutzen Sie ihn immer vor dem Reload — Caddy verweigert den Start bei ungültiger Konfiguration und liefert präzise Fehlermeldungen.
# 1. Caddyfile-Syntax prüfen
caddy validate --config /etc/caddy/Caddyfile
# 2. Caddy neu laden (ohne Downtime)
sudo systemctl reload caddy
# oder: caddy reload --config /etc/caddy/Caddyfile
# 3. Header verifizieren
curl -sI https://ihre-domain.de | grep -i x-content-type
# Erwartete Ausgabe:
# x-content-type-options: nosniff
# 4. Upload-Pfad prüfen
curl -sI https://ihre-domain.de/uploads/test.jpg | grep -i "content-disposition|x-content-type" Caddy bietet eine Admin-API auf localhost:2019. Mit curl localhost:2019/config/ können Sie die aktive Konfiguration inspizieren und mit caddy reload hot-reloaden — ohne Prozess-Neustart.
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
Setzt Caddy Security-Header automatisch?
Caddy setzt einige Security-Header automatisch — darunter Strict-Transport-Security bei HTTPS-Seiten. X-Content-Type-Options: nosniff ist jedoch kein automatischer Standard-Header in Caddy und muss explizit im Caddyfile konfiguriert werden.
Wie setze ich einen Header global für alle Sites in Caddy?
In Caddy v2 können Sie globale Header im Snippet definieren und per import in jeden Site-Block einbinden. Alternativ setzen Sie den Header in einem globalen options-Block via servers > trusted_proxies, aber für einfache Header ist das Snippet-Pattern die sauberste Methode.
Was ist der Unterschied zwischen "header" und "header_up" in Caddy?
"header" modifiziert Response-Header (was an den Client gesendet wird). "header_up" modifiziert Request-Header (was an den Upstream-Server gesendet wird). Für X-Content-Type-Options verwenden Sie immer "header" — es ist ein Response-Header, der den Browser instruiert.
Wie konfiguriere ich Caddy als Reverse Proxy mit Security-Headern?
In einem reverse_proxy-Block können Sie header-Direktiven für Responses kombinieren: reverse_proxy localhost:3000 { header_down X-Content-Type-Options nosniff }. Das fügt den Header zur Upstream-Antwort hinzu, ohne den Ursprungsserver zu modifizieren.
Unterstützt Caddy MIME-Typ-Konfiguration wie Apache AddType?
Caddy erkennt MIME-Typen automatisch aus Dateiendungen über die Go mime-Bibliothek. Für Sonderfälle können Sie mit "header Content-Type text/javascript" den Content-Type überschreiben. Die meisten Standard-Typen (JS, CSS, JSON) werden korrekt erkannt.