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.

Caddy · Schritt für Schritt

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.

1 Schritt 1 von 4

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.

/etc/caddy/Caddyfile header
# 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
}
/etc/caddy/Caddyfile — Snippet-Pattern Snippets
# 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
}
Konfiguration prüfen und neu laden:
caddy validate --config /etc/caddy/Caddyfile && sudo systemctl reload caddy
2 Schritt 2 von 4

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.

Prüfen Sie mit 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.
Caddy + Reverse Proxy

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.

3 Schritt 3 von 4

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.

/etc/caddy/Caddyfile — Upload-Schutz Upload-Schutz
# 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 vs. route in Caddy

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.

4 Schritt 4 von 4

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.

Terminal Verifizierung
# 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 Admin API

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.