Chaque exemple définit les mêmes valeurs de départ. Les plateformes d’hébergement envoient peut-être déjà Strict-Transport-Security, c’est pourquoi les exemples Vercel, Netlify et Next.js ne l’incluent pas ; vérifiez la réponse réelle et ajoutez-le seulement s’il manque.
nginx
Placez les lignes dans le bloc server qui sert HTTPS. Le paramètre always les ajoute aussi aux réponses d’erreur. Un bloc location qui a ses propres lignes add_header abandonne toutes les add_header héritées du bloc server : répétez l’ensemble à cet endroit ou gardez-le dans un seul fichier include.
# 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
Activez mod_headers et ajoutez les lignes au virtual host du port 443, ou à un fichier .htaccess là où AllowOverride FileInfo est actif. Header always set couvre aussi les réponses d’erreur et les redirections.
# <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
Dans le tableau de bord, créez une Response Header Transform Rule pour votre nom d’hôte et ajoutez chaque en-tête avec l’opération Set static, qui remplace un en-tête du même nom venant de votre origine. HSTS a son propre réglage sous SSL/TLS, Edge Certificates ; utilisez ce réglage ou la règle, pas les deux. Les noms des menus peuvent varier selon la version du tableau de bord.
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
Ajoutez une entrée headers à vercel.json à la racine du projet. Le motif source /(.*) correspond à tous les chemins ; restreignez-le si certaines routes ont besoin d’une autre politique.
{
"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
Créez un fichier nommé _headers dans le répertoire de publication, le dossier que Netlify déploie. Chaque ligne de chemin, comme /*, est suivie de lignes indentées Nom: valeur. Les mêmes règles peuvent aussi aller dans netlify.toml sous [[headers]].
/*
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
Renvoyez les en-têtes depuis la fonction async headers() de next.config.js ; le source '/:path*' couvre toutes les routes. headers() ne s’exécute pas pour un export statique (output: 'export') : définissez alors les en-têtes chez l’hébergeur qui sert les fichiers exportés.
// 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 }];
},
};
Après le déploiement, relancez le vérificateur : il lit la réponse finale et montre donc ce que votre CDN ou votre plateforme envoie réellement. Ouvrez ensuite une page d’erreur et un fichier statique dans les outils de développement du navigateur, car les en-têtes ne sont souvent définis que pour certaines réponses.