Ogni esempio imposta gli stessi valori iniziali. Le piattaforme di hosting potrebbero già inviare Strict-Transport-Security, perciò gli esempi per Vercel, Netlify e Next.js non lo includono; controlla la risposta reale e aggiungilo solo se manca.
nginx
Metti le righe nel blocco server che serve HTTPS. Il parametro always le aggiunge anche alle risposte di errore. Un blocco location con righe add_header proprie scarta tutte quelle ereditate dal blocco server, quindi ripeti l’insieme lì o tienilo in un unico file 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
Attiva mod_headers e aggiungi le righe al virtual host della porta 443, oppure a .htaccess dove è impostato AllowOverride FileInfo. Header always set copre anche le risposte di errore e i redirect.
# <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
Nella dashboard crea una Response Header Transform Rule per il tuo nome host e aggiungi ogni header con l’operazione Set static, che sostituisce un header con lo stesso nome proveniente dalla tua origine. HSTS ha un’impostazione propria in SSL/TLS, Edge Certificates; usa quella o la regola, non entrambe. I nomi dei menu possono cambiare tra le versioni della dashboard.
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
Aggiungi una voce headers a vercel.json nella radice del progetto. Il pattern source /(.*) corrisponde a ogni percorso; restringilo se alcune route richiedono una policy diversa.
{
"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
Crea un file chiamato _headers nella directory di pubblicazione, la cartella che Netlify distribuisce. Ogni riga di percorso, come /*, è seguita da righe rientrate Nome: valore. Le stesse regole possono stare anche in netlify.toml sotto [[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
Restituisci gli header dalla funzione async headers() in next.config.js; il source '/:path*' copre ogni route. headers() non viene eseguita in un export statico (output: 'export'), quindi in quel caso imposta gli header sull’host che serve i file esportati.
// 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 }];
},
};
Dopo il deploy, esegui di nuovo la verifica: legge la risposta finale, quindi mostra ciò che la tua CDN o piattaforma invia davvero. Poi apri una pagina di errore e un file statico negli strumenti per sviluppatori del browser, perché spesso gli header sono impostati solo per alcune risposte.