# Como corrigir os cabeçalhos de segurança que não aplicam no WordPress com All in One Security

Os security headers no WordPress não aplicam quando você os adiciona via .htaccess no All in One Security, mas o servidor roda Nginx ou um proxy que ignora o .htaccess, quando outro componente já envia o mesmo cabeçalho, ou quando a regra foi colada no bloco errado do arquivo.

## O que é security headers que não aplicam no AIOS?

Security headers são cabeçalhos HTTP que o servidor envia junto com cada resposta para instruir o navegador a reforcar a segurança da página. Os mais comuns são o X-Frame-Options (impede que o site seja carregado dentro de um iframe de terceiros), o X-Content-Type-Options (bloqueia o MIME-sniffing), o Strict-Transport-Security ou HSTS (força HTTPS), o Referrer-Policy e o Content-Security-Policy. No WordPress, uma forma de configura-los e pelo All in One Security, que escreve diretivas no arquivo .htaccess do site.

O problema aparece quando esses cabeçalhos não chegam na resposta HTTP, mesmo com a regra cadastrada no painel do AIOS. A documentação oficial do plugin e direta sobre o limite técnico: recursos que usam o arquivo .htaccess não se aplicam em servidores Nginx ou Windows IIS, e o próprio AIOS remove as opções de .htaccess do menu nesses ambientes. O AIOS também não tem uma tela dedicada de Security Headers: os cabeçalhos são adicionados manualmente em Tools, no campo de regras .htaccess personalizadas. Se o servidor ignora o .htaccess, se outro plugin ou camada de CDN já envia o cabeçalho, ou se a sintaxe esta fora do bloco mod_headers, o navegador nunca recebe o header esperado.

## Como identificar

- Ferramentas como securityheaders.com ou a aba Network do navegador mostram a ausencia de 'X-Frame-Options', 'X-Content-Type-Options' ou 'Strict-Transport-Security' na resposta HTTP, mesmo após salvar a regra no AIOS.
- O menu de regras .htaccess do AIOS some ou exibe um aviso de que o servidor não suporta .htaccess (tipico de hospedagem Nginx ou IIS).
- Aparecem cabeçalhos duplicados na resposta, como dois 'X-Frame-Options' diferentes, porque o plugin e o servidor enviam o mesmo header.
- Após colar a regra de header, o site retorna '500 Internal Server Error' e o navegador exibe 'This page isn't working' por causa de sintaxe invalida no .htaccess.
- O cabeçalho aparece ao acessar o servidor de origem diretamente, mas some quando a requisicao passa pelo CDN ou proxy reverso na frente do site.

**Antes de começar:** Antes de editar o .htaccess ou a configuração do Nginx, faca um backup do arquivo e, de preferencia, teste primeiro em staging. Uma diretiva de header malformada pode derrubar o site inteiro com erro 500, e o HSTS aplicado cedo demais pode travar o acesso por HTTPS antes do certificado estar correto.

## Como prevenir

- Antes de configurar headers no AIOS, confirme se a hospedagem e Apache/LiteSpeed; em Nginx ou IIS, planeje a aplicação direto na configuração do servidor desde o inicio.
- Centralize os cabeçalhos de segurança em uma única camada (plugin, servidor ou CDN) para nunca ter o mesmo header enviado por duas fontes.
- Valide a resposta HTTP em staging com curl -I ou em um scanner de headers antes de subir a regra para producao.
- Introduza o Strict-Transport-Security com max-age curto primeiro e so aumente o prazo depois de confirmar que todo o tráfego funciona em HTTPS, evitando lockout.

Erros relacionados

- [Como corrigir as regras de firewall que não aplicam no All in One Security](https://full.services/wp-fixer/corrigir-firewall-regras-aios/)
- [Como corrigir falsos positivos do File Change Detection no All in One Security](https://full.services/wp-fixer/corrigir-file-change-detection-aios/)
- [Como corrigir os alertas de e-mail que não chegam no All in One Security](https://full.services/wp-fixer/corrigir-alertas-email-aios/)

## Causa

- O site roda em servidor Nginx ou Windows IIS: a documentação oficial do AIOS afirma que recursos baseados em .htaccess não se aplicam nesses servidores, e o plugin remove as opções de .htaccess do menu, entao os cabeçalhos colados ali nunca são lidos.
- Os cabeçalhos foram colados fora de um bloco 'IfModule mod_headers.c' valido em Tools, regras .htaccess personalizadas do AIOS, e o Apache ignora a diretiva Header set quando o módulo headers não esta carregado ou o bloco esta mal formado.
- Outro componente da pilha (o tema, outro plugin de segurança, ou o painel da hospedagem) já envia o mesmo cabeçalho, gerando duplicidade ou sobrescrita que cancela o header definido no AIOS.
- Uma CDN ou proxy reverso na frente do site (como Cloudflare) remove ou substitui os cabeçalhos de origem antes de entregar a resposta ao navegador, mascarando o header definido no .htaccess do WordPress.
- O módulo mod_headers do Apache não esta habilitado na hospedagem, entao toda diretiva Header do .htaccess e ignorada silenciosamente sem aplicar nenhum cabeçalho.

## Como resolver

1. Confirme se o servidor e Apache, Nginx ou IIS: Os cabeçalhos do AIOS dependem do .htaccess, que so funciona em Apache e LiteSpeed. Se o menu de regras .htaccess sumiu no AIOS, o servidor e Nginx ou IIS e você precisa aplicar os headers na configuração do servidor, não no plugin. Verifique o cabeçalho Server da resposta para identificar a stack.

```
Painel WP -> WP Security -> Settings -> aba .htaccess File (se ausente, o servidor não usa .htaccess)
No terminal: curl -I https://seusite.com.br
Observe a linha 'Server:' (Apache/LiteSpeed usam .htaccess; nginx não)
```

2. Adicione os cabeçalhos em Tools, regras .htaccess do AIOS: O AIOS não tem tela dedicada de Security Headers; os cabeçalhos entram pelo campo de regras .htaccess personalizadas em Tools. Cole o bloco dentro de um IfModule mod_headers.c para o Apache so aplicar quando o módulo existir, evitando erro 500.

```
Painel WP -> WP Security -> Tools -> .htaccess
Cole o bloco de headers (veja a seção de código abaixo) e salve
Recarregue o site e teste com: curl -I https://seusite.com.br
```

3. Se o servidor for Nginx ou IIS, aplique no servidor: Em Nginx os headers não saem do .htaccess; eles precisam ir no bloco server do arquivo de configuração do site, via diretiva add_header, e o serviço precisa ser recarregado. Na maioria das hospedagens gerenciadas isso e feito pelo suporte ou pelo painel.

```
Edite o server block do site (ex.: /etc/nginx/sites-available/seusite)
add_header X-Content-Type-Options "nosniff" always;
Salve e recarregue: sudo nginx -t && sudo systemctl reload nginx
```

4. Elimine cabeçalhos duplicados: Se o teste mostrar o mesmo cabeçalho duas vezes, outro plugin, o tema ou a hospedagem já o envia. Mantenha apenas uma fonte: ou remova a regra do AIOS, ou desative o header no outro componente, para o navegador receber um único valor consistente.

```
curl -I https://seusite.com.br | grep -i x-frame-options
Se aparecer duas vezes, remova o header de uma das fontes (AIOS ou outro plugin)
Teste de novo até restar uma única linha por cabeçalho
```

5. Verifique a CDN ou proxy na frente do site: Se o header aparece no servidor de origem mas some pelo domínio público, uma CDN ou proxy reverso esta filtrando a resposta. Configure os cabeçalhos no painel da CDN ou faca o proxy repassar os headers de origem, e limpe o cache após a mudanca.

```
Compare a origem e o domínio: curl -I --resolve seusite.com.br:443:IP_DE_ORIGEM https://seusite.com.br
No painel da CDN, configure os Transform Rules / Response Headers ou habilite o passthrough
Purgue o cache da CDN após salvar
```


## Código

```apache
# Cole em WP Security -> Tools -> .htaccess (servidores Apache/LiteSpeed)
<IfModule mod_headers.c>
    Header set X-Frame-Options "SAMEORIGIN"
    Header set X-Content-Type-Options "nosniff"
    Header set Referrer-Policy "strict-origin-when-cross-origin"
    Header set Permissions-Policy "geolocation=(), microphone=(), camera=()"
    # Ative o HSTS so depois de confirmar que todo o trafego usa HTTPS
    Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains" env=HTTPS
</IfModule>
```

## Perguntas frequentes

### Por que os security headers do AIOS não aparecem na resposta HTTP

Na maioria dos casos o site roda em Nginx ou IIS. A documentação do AIOS diz que recursos baseados em .htaccess não se aplicam nesses servidores, entao os cabeçalhos colados no plugin são ignorados. Nesse caso, aplique os headers direto na configuração do servidor.

### O All in One Security tem uma tela própria de Security Headers

Não. O AIOS não traz um painel dedicado de cabeçalhos de segurança. Os headers são adicionados manualmente em WP Security, Tools, no campo de regras .htaccess personalizadas, o que so vale para servidores que leem o .htaccess.

### Como adiciono security headers no WordPress com Nginx

Em Nginx os cabeçalhos vao na diretiva add_header dentro do bloco server da configuração do site, e o serviço precisa ser recarregado com nginx -t e reload. Em hospedagem gerenciada, normalmente o suporte ou o painel da hospedagem faz essa configuração.

### Por que aparece o cabeçalho X-Frame-Options duplicado

Duplicidade ocorre quando o AIOS e outro componente, como o tema, outro plugin ou a hospedagem, enviam o mesmo cabeçalho. Mantenha apenas uma fonte do header para o navegador receber um valor único e consistente.

### Configurar headers no AIOS pode quebrar o site com erro 500

Pode, se a regra for colada com sintaxe invalida no .htaccess ou fora de um bloco IfModule mod_headers.c valido. Por isso o bloco deve usar o IfModule e ser testado em staging antes de ir para producao.

### Por que o header aparece na origem mas some no domínio público

Isso indica uma CDN ou proxy reverso na frente do site removendo ou substituindo o cabeçalho antes de entregar a resposta. Configure os headers no painel da CDN ou faca o proxy repassar os cabeçalhos de origem e limpe o cache.

### Preciso do mod_headers para os cabeçalhos funcionarem no Apache

Sim. A diretiva Header set depende do módulo mod_headers do Apache. Se ele não estiver habilitado na hospedagem, as regras do .htaccess são ignoradas sem aviso. Por isso o bloco e protegido por IfModule mod_headers.c.

**Fonte:** [All-In-One Security (AIOS) - Security and Firewall - WordPress.org](https://wordpress.org/plugins/all-in-one-wp-security-and-firewall/)
