X-Content-Type-Options mit Cloudflare konfigurieren

Schritt-für-Schritt-Anleitung: nosniff via Transform Rules im Dashboard setzen, Workers für dynamische Header und Cloudflare Pages _headers-Datei.

Cloudflare · Schritt für Schritt

X-Content-Type-Options mit Cloudflare

Cloudflare bietet mehrere Methoden für HTTP-Security-Header — ohne Zugriff auf den Ursprungsserver. Die einfachste Methode sind Transform Rules im Dashboard: UI-basiert, kein Code, kostenlos im Free-Plan. Alternativ können Cloudflare Workers für dynamische Header-Logik verwendet werden.

Für Cloudflare Pages gibt es eine dedizierte _headers-Datei im public-Verzeichnis. Diese Anleitung zeigt alle drei Methoden.

1 Schritt 1 von 4

Transform Rules im Dashboard

Transform Rules (Modify Response Header) sind die empfohlene Methode für statische Security-Header. Sie werden im Cloudflare-Dashboard konfiguriert und gelten für alle Routen, die durch den Proxy laufen. Kein Code, keine Deployment-Pipeline nötig.

Cloudflare Dashboard → Rules → Transform Rules UI-Konfiguration
# Cloudflare Dashboard → Ihre Domain → Rules → Transform Rules
# → Modify Response Header → Create Rule

# Rule-Konfiguration:
Name: Security Headers — X-Content-Type-Options

# When incoming requests match:
Expression: (http.host eq "ihre-domain.de")
# Oder für alle Routen: true

# Then:
Set static response header:
  Header name:  X-Content-Type-Options
  Value:        nosniff
Free Plan: 10 Regeln kostenlos

Transform Rules sind im Free Plan bis zu 10 Regeln kostenlos. Eine Regel für alle Security-Header (X-Content-Type-Options, X-Frame-Options, Referrer-Policy) reicht aus — mehrere Header in einer Regel möglich.

2 Schritt 2 von 4

Cloudflare Workers

Für Worker-basierte Anwendungen oder wenn dynamische Header-Logik benötigt wird, setzen Sie den Header direkt im Worker. Der Worker empfängt die Ursprungsantwort, modifiziert die Headers und leitet sie an den Client weiter.

worker.js Workers
// Cloudflare Workers — Security Headers setzen
export default {
  async fetch(request, env, ctx) {
    // Request an Ursprungsserver weiterleiten
    const response = await fetch(request);

    // Headers modifizieren (neue Response erstellen)
    const newHeaders = new Headers(response.headers);
    newHeaders.set('X-Content-Type-Options', 'nosniff');
    newHeaders.set('X-Frame-Options', 'SAMEORIGIN');
    newHeaders.set('Referrer-Policy', 'strict-origin-when-cross-origin');

    return new Response(response.body, {
      status: response.status,
      statusText: response.statusText,
      headers: newHeaders,
    });
  },
};
Wenn Sie Transform Rules und Workers gleichzeitig nutzen, achten Sie auf die Reihenfolge: Transform Rules werden nach Workers ausgeführt — Workers-Header können durch Transform Rules überschrieben werden. Nutzen Sie eine Methode pro Header-Typ.
3 Schritt 3 von 4

Alle Ressourcentypen absichern

Für Cloudflare Pages gibt es eine spezielle _headers-Datei im public-Verzeichnis. Sie ist die schnellste Methode für Pages-Deployments — kein Workers-Code nötig. Das Format folgt einer einfachen Syntax mit URL-Patterns.

public/_headers (Cloudflare Pages) Pages
# Cloudflare Pages: public/_headers
# Gilt für alle Routen auf Cloudflare Pages

/*
  X-Content-Type-Options: nosniff
  X-Frame-Options: SAMEORIGIN
  Referrer-Policy: strict-origin-when-cross-origin

# Upload-Bereich: Downloads erzwingen
/uploads/*
  X-Content-Type-Options: nosniff
  Content-Disposition: attachment
_headers vs. wrangler.toml

Die _headers-Datei gilt nur für Cloudflare Pages. Für Workers-Deployments via wrangler setzen Sie den Header im Worker-Code oder via Transform Rules.

4 Schritt 4 von 4

Verifizierung

Prüfen Sie den Header mit curl. Der cf-ray-Header in der Antwort bestätigt, dass der Traffic durch den Cloudflare-Proxy läuft und die Transform Rules greifen. Ohne cf-ray haben Sie möglicherweise den Proxy-Modus (orange Cloud) nicht aktiviert.

Terminal Verifizierung
# Header + Cloudflare-Ray-ID prüfen
curl -sI https://ihre-domain.de | grep -i "x-content-type|cf-ray"

# Erwartete Ausgabe:
# x-content-type-options: nosniff
# cf-ray: [Ray-ID] — bestätigt Cloudflare-Proxy

# API-Route prüfen
curl -sI https://ihre-domain.de/api/data | grep -i x-content-type

# Statisches Asset prüfen
curl -sI https://ihre-domain.de/main.js | grep -i x-content-type
Transform Rules greifen nur, wenn die Domain im Proxy-Modus ist (orange Cloud im DNS-Tab). Bei DNS-only (graue Cloud) läuft Traffic an Cloudflare vorbei — Header werden nicht gesetzt.

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 Cloudflare X-Content-Type-Options automatisch?

Nein. Cloudflare setzt den Header nicht automatisch — Sie müssen ihn explizit via Transform Rules oder Workers konfigurieren. Cloudflare entfernt auch keine vom Ursprungsserver gesetzten Header, sofern Sie es nicht explizit konfigurieren.

Was ist der Unterschied zwischen Transform Rules und Workers für Header?

Transform Rules sind einfacher zu konfigurieren (UI-basiert, kein Code), gelten für alle Routen und sind kostenlos (bis zu 10 Regeln im Free-Plan). Workers bieten volle Flexibilität für dynamische Logik, erfordern aber JavaScript-Code und haben separate Billing. Für einfache Security-Header sind Transform Rules die bessere Wahl.

Überschreibt Cloudflare meine Ursprungsserver-Header?

Transform Rules mit "Set" überschreiben vorhandene Header. Mit "Add" wird ein zusätzlicher Header hinzugefügt (auch wenn einer existiert). Für X-Content-Type-Options empfehlen wir "Set" — es stellt sicher, dass immer genau ein Wert ("nosniff") gesetzt ist, unabhängig davon was der Ursprungsserver sendet.

Gilt die Transform Rule auch für Cloudflare Pages und Workers?

Transform Rules gelten für Traffic, der durch den Cloudflare-Proxy läuft. Bei Cloudflare Pages müssen Sie den Header entweder in der _headers-Datei oder via Pages Functions (ähnlich Workers) setzen. Workers können direkt in ihrer fetch()-Handler-Funktion Headers setzen.

Kann ich mit Cloudflare Workers auch MIME-Typen korrigieren?

Ja. Ein Worker kann den Content-Type-Header der Ursprungsantwort überschreiben. Das ist nützlich, wenn Ihr Server veraltete MIME-Typen (z.B. application/javascript statt text/javascript) sendet. Im Worker: response.headers.set("Content-Type", "text/javascript") vor der Antwort an den Client.