X-Content-Type-Options für Astro konfigurieren
Schritt-für-Schritt-Anleitung: MIME-Sniffing per Middleware verhindern -- nosniff-Header für SSR und SSG korrekt setzen.
X-Content-Type-Options in Astro
X-Content-Type-Options: nosniff verhindert, dass Browser den MIME-Typ einer Ressource erraten (MIME-Sniffing). Ohne diesen Header kann ein Browser eine als Text deklarierte Datei als JavaScript ausführen -- ein Sicherheitsrisiko, das zu Cross-Site-Scripting führen kann. Der Header ist mit 10 von 166 Punkten im Wolf-Agents Web Security Check relevant.
Dieser Header hat nur einen einzigen gültigen Wert: nosniff. In Astro setzen Sie ihn per Middleware (SSR) oder auf dem Webserver (SSG). Der Header ist einfach zu konfigurieren und hat keine Nebenwirkungen -- er sollte auf jeder Website gesetzt sein. Wolf-Agents setzt diesen Header produktiv per Astro-Middleware.
Besonders wichtig ist nosniff in Kombination mit Astros Build-Pipeline: Vite generiert Assets mit Content-Hashes, aber wenn der Webserver falsche MIME-Typen liefert, kann der Browser ohne nosniff den Typ erraten und Scripts ausführen, die nicht als solche deklariert sind.
nosniff-Header per Middleware (SSR)
Setzen Sie den Header in der Middleware. Die Middleware laeuft bei jedem SSR-Request und setzt den Header konsistent für alle Seiten und API-Routen. In der Praxis kombinieren Sie nosniff mit weiteren Security-Headern in einer einzigen Middleware.
// src/middleware.ts -- X-Content-Type-Options (SSR)
import { defineMiddleware } from 'astro:middleware';
export const onRequest = defineMiddleware(async (context, next) => {
const response = await next();
// MIME-Sniffing verhindern
response.headers.set('X-Content-Type-Options', 'nosniff');
return response;
});// src/middleware.ts -- Kombiniert mit weiteren Security-Headern
import { defineMiddleware } from 'astro:middleware';
export const onRequest = defineMiddleware(async (context, next) => {
const response = await next();
// MIME-Sniffing verhindern
response.headers.set('X-Content-Type-Options', 'nosniff');
// Weitere Header, die typischerweise zusammen gesetzt werden
response.headers.set('X-Frame-Options', 'DENY');
response.headers.set('Referrer-Policy', 'strict-origin-when-cross-origin');
return response;
});SSG-Hosting-Varianten
Für statische Deployments mit export const prerender = true oder reinem SSG-Output greift die Middleware nicht. Setzen Sie den Header auf dem Webserver oder der Hosting-Plattform. Achten Sie bei Nginx darauf, dass add_header in verschachtelten location-Bloecken die Parent-Header überschreibt -- setzen Sie den Header in jedem relevanten Block.
# Nginx -- X-Content-Type-Options (SSG)
add_header X-Content-Type-Options "nosniff" always;
# Korrekte MIME-Typen für Astro-Assets
location /_astro/ {
add_header X-Content-Type-Options "nosniff" always;
types {
application/javascript js mjs;
text/css css;
image/svg+xml svg;
}
}// vercel.json -- X-Content-Type-Options
{
"headers": [{
"source": "/(.*)",
"headers": [{
"key": "X-Content-Type-Options",
"value": "nosniff"
}]
}]
}# public/_headers -- Netlify/Cloudflare Pages
/*
X-Content-Type-Options: nosniffContent-Types der Astro-Build-Pipeline prüfen
nosniff erzwingt, dass der Browser den deklarierten MIME-Typ verwendet. Wenn Astros Build-Pipeline oder der Webserver falsche Content-Types liefert, werden Ressourcen blockiert. Prüfen Sie die MIME-Typen aller Assets nach dem Build.
# Content-Types im Build prüfen
curl -sI https://ihre-domain.de/_astro/main.abc123.js | grep content-type
# Content-Type: application/javascript; charset=utf-8
curl -sI https://ihre-domain.de/_astro/style.def456.css | grep content-type
# Content-Type: text/css; charset=utf-8
# SVG-Dateien müssen korrekt ausgeliefert werden
curl -sI https://ihre-domain.de/logo.svg | grep content-type
# Content-Type: image/svg+xml Verifizieren
Prüfen Sie den X-Content-Type-Options-Header im Production-Build. Der Header muss bei allen Responses vorhanden sein -- HTML-Seiten, API-Routen und statische Assets.
# X-Content-Type-Options prüfen
curl -sI https://ihre-domain.de | grep -i x-content-type
# X-Content-Type-Options: nosniff
# Auch bei API-Routen prüfen
curl -sI https://ihre-domain.de/api/health | grep -i x-content-type
# X-Content-Type-Options: nosniff
# Wolf-Agents Web Security Check für vollständige Analyse
# https://wolf-agents.com/tools/web-security-check Zusammenspiel mit der Astro-Build-Pipeline
Astros Vite-Build-Pipeline generiert Assets mit korrekten MIME-Typen: .js als application/javascript, .css als text/css, .svg als image/svg+xml. Der Webserver (Nginx, Caddy, Vercel) muss diese MIME-Typen korrekt weiterleiten. Mit nosniff aktiv blockiert der Browser jede Ressource mit falschem Content-Type.
Besonders relevant bei Astro: Dynamisch generierte API-Responses müssen den korrekten Content-Type setzen. Wenn eine API-Route JSON zurückgibt, muss der Header Content-Type: application/json gesetzt sein. Astros Response-Konstruktor setzt den Content-Type nicht automatisch -- Sie müssen ihn explizit angeben.
Wolf-Agents validiert korrekte Content-Types als Teil des Web Security Checks. Wenn nosniff gesetzt ist, aber Assets mit falschem MIME-Typ ausgeliefert werden, führt das zu blockierten Ressourcen und fehlerhafter Darstellung.
Häufige Fehler bei X-Content-Type-Options in Astro
Header doppelt gesetzt
Wenn Middleware und Webserver beide den Header setzen, kann er doppelt erscheinen. Einige Browser akzeptieren nur den ersten Wert, andere den letzten. Setzen Sie den Header an genau einer Stelle -- bei SSR in der Middleware, bei SSG auf dem Webserver.
Falscher Content-Type bei Assets
nosniff erzwingt den deklarierten MIME-Typ. Wenn ein JavaScript-File als text/plain ausgeliefert wird, blockiert der Browser die Ausführung. Stellen Sie korrekte Content-Types in der Nginx-Konfiguration und der Astro-Build-Pipeline sicher.
prerender=true ohne Server-Header
Seiten mit export const prerender = true im Hybrid-Modus werden statisch ausgeliefert und erhalten keine Middleware-Header. Setzen Sie den Header zusätzlich auf dem Webserver, um prerenderte Seiten abzudecken.
Nginx location-Block überschreibt Header
Wenn Sie add_header in einem location-Block setzen, erbt dieser Block keine Header aus dem server-Block. Setzen Sie X-Content-Type-Options in jedem location-Block oder verwenden Sie include für gemeinsame Header.
Compliance-Relevanz
X-Content-Type-Options: nosniff ist eine Grundanforderung für NIS2-konforme Webauftritte. MIME-Sniffing kann zu Script-Injection führen -- ein Angriffsszenario, das durch diesen Header zuverlässig verhindert wird. PCI DSS 4.0 erwartet eine vollständige Header-Absicherung für Webanwendungen, die Zahlungsdaten verarbeiten. Der Wolf-Agents Web Security Check bewertet diesen Header mit bis zu 10 Punkten.
Wie steht Ihre Domain bei X-Content-Type-Options?
Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.