Jedes Beispiel setzt dieselben Startwerte. Hosting-Plattformen senden Strict-Transport-Security womöglich schon selbst, deshalb fehlt der Header in den Beispielen für Vercel, Netlify und Next.js; prüfe die echte Antwort und ergänze ihn nur, wenn er fehlt.
nginx
Setze die Zeilen in den server-Block, der HTTPS ausliefert. Der Parameter always fügt sie auch Fehlerantworten hinzu. Ein location-Block mit eigenen add_header-Zeilen verwirft alle add_header-Zeilen, die er sonst vom server-Block erben würde; wiederhole den Satz dort oder lege ihn in eine einzige include-Datei.
# In the server block that serves HTTPS (listen 443 ssl)
add_header Strict-Transport-Security "max-age=300" always;
add_header Content-Security-Policy-Report-Only "default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
Apache
Aktiviere mod_headers und füge die Zeilen dem Virtual Host für Port 443 hinzu oder einer .htaccess-Datei, wo AllowOverride FileInfo gesetzt ist. Header always set gilt auch für Fehlerantworten und Weiterleitungen.
# <VirtualHost *:443> or .htaccess; needs mod_headers (Debian/Ubuntu: a2enmod headers)
Header always set Strict-Transport-Security "max-age=300"
Header always set Content-Security-Policy-Report-Only "default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
Cloudflare
Lege im Dashboard für deinen Hostnamen eine Response Header Transform Rule an und füge jeden Header mit der Operation Set static hinzu; sie ersetzt einen gleichnamigen Header deines Origins. HSTS hat eine eigene Einstellung unter SSL/TLS, Edge Certificates; nutze diese oder die Regel, nicht beides. Menünamen können je nach Dashboard-Version abweichen.
Rule type Response Header Transform Rule
When Hostname equals example.com
Then Set static, one row per header:
X-Content-Type-Options nosniff
Referrer-Policy strict-origin-when-cross-origin
X-Frame-Options SAMEORIGIN
Permissions-Policy camera=(), microphone=(), geolocation=()
Content-Security-Policy-Report-Only default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'
HSTS SSL/TLS > Edge Certificates > HTTP Strict Transport Security (HSTS)
Vercel
Füge der Datei vercel.json im Projektstamm einen headers-Eintrag hinzu. Das source-Muster /(.*) passt auf jeden Pfad; grenze es ein, wenn einzelne Routen eine andere Richtlinie brauchen.
{
"headers": [
{
"source": "/(.*)",
"headers": [
{ "key": "Content-Security-Policy-Report-Only", "value": "default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'" },
{ "key": "X-Frame-Options", "value": "SAMEORIGIN" },
{ "key": "X-Content-Type-Options", "value": "nosniff" },
{ "key": "Referrer-Policy", "value": "strict-origin-when-cross-origin" },
{ "key": "Permissions-Policy", "value": "camera=(), microphone=(), geolocation=()" }
]
}
]
}
Netlify
Lege im Publish-Verzeichnis, dem Ordner, den Netlify ausliefert, eine Datei namens _headers an. Auf jede Pfadzeile wie /* folgen eingerückte Zeilen im Format Name: Wert. Dieselben Regeln können auch in netlify.toml unter [[headers]] stehen.
/*
Content-Security-Policy-Report-Only: default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=()
Next.js
Gib die Header in next.config.js aus der Funktion async headers() zurück; source '/:path*' deckt jede Route ab. Bei einem statischen Export (output: 'export') läuft headers() nicht, setze die Header dann auf dem Host, der die exportierten Dateien ausliefert.
// next.config.js
const securityHeaders = [
{ key: 'Content-Security-Policy-Report-Only', value: "default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'" },
{ key: 'X-Frame-Options', value: 'SAMEORIGIN' },
{ key: 'X-Content-Type-Options', value: 'nosniff' },
{ key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin' },
{ key: 'Permissions-Policy', value: 'camera=(), microphone=(), geolocation=()' },
];
module.exports = {
async headers() {
return [{ source: '/:path*', headers: securityHeaders }];
},
};
Führe den Checker nach dem Deployment erneut aus: Er liest die finale Antwort und zeigt daher, was dein CDN oder deine Plattform wirklich sendet. Öffne danach eine Fehlerseite und eine statische Datei in den Entwicklertools deines Browsers, denn Header werden oft nur für einen Teil der Antworten gesetzt.