Todos os exemplos definem os mesmos valores iniciais. Plataformas de hospedagem podem já enviar Strict-Transport-Security, por isso os exemplos de Vercel, Netlify e Next.js não o incluem; verifique a resposta real e adicione-o só se estiver faltando.
nginx
Coloque as linhas no bloco server que serve HTTPS. O parâmetro always também as adiciona às respostas de erro. Um bloco location com linhas add_header próprias descarta todas as add_header herdadas do bloco server, então repita o conjunto ali ou mantenha-o em um único arquivo 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
Ative o mod_headers e adicione as linhas ao virtual host da porta 443, ou ao .htaccess onde AllowOverride FileInfo estiver ativo. Header always set também cobre respostas de erro e redirecionamentos.
# <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
No painel, crie uma Response Header Transform Rule para o seu nome de host e adicione cada cabeçalho com a operação Set static, que substitui um cabeçalho de mesmo nome vindo da sua origem. O HSTS tem uma configuração própria em SSL/TLS, Edge Certificates; use essa configuração ou a regra, não as duas. Os nomes dos menus podem variar de acordo com a versão do painel.
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
Adicione uma entrada headers ao vercel.json na raiz do projeto. O padrão source /(.*) corresponde a todos os caminhos; restrinja-o se algumas rotas precisarem de outra política.
{
"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
Crie um arquivo chamado _headers no diretório de publicação, a pasta que o Netlify publica. Cada linha de caminho, como /*, é seguida por linhas recuadas Nome: valor. As mesmas regras também podem ficar no netlify.toml em [[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
Retorne os cabeçalhos da função async headers() no next.config.js; o source '/:path*' cobre todas as rotas. headers() não é executada em uma exportação estática (output: 'export'); nesse caso, defina os cabeçalhos no host que serve os arquivos exportados.
// 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 }];
},
};
Depois de publicar, execute o verificador de novo: ele lê a resposta final e mostra o que a sua CDN ou plataforma realmente envia. Em seguida, abra uma página de erro e um arquivo estático nas ferramentas de desenvolvedor do navegador, porque os cabeçalhos muitas vezes são definidos só para algumas respostas.