Erro 403 Forbidden: o que bloqueia o acesso ao seu site
· 7 min de leitura
O que o erro significa
Um 403 não é uma falha: o servidor recebeu o pedido, entendeu e decidiu não atender. O navegador mostra “403 Forbidden”, “Acesso negado” ou a página de erro do próprio site. Em um site de outra pessoa, o motivo costuma ser uma escolha do dono: conteúdo restrito, país ou rede excluídos, VPN ou IP bloqueados, pedidos demais em pouco tempo. Você só pode tentar de novo de outra rede, sem VPN, alguns minutos depois; se continuar, é intencional.
No seu site a conversa é outra: um 403 repentino, em todas as páginas ou em uma pasta, nasce quase sempre de uma permissão errada, de uma linha em um .htaccess, de uma regra de segurança que confundiu um pedido normal com um ataque ou de um firewall. O resto do guia trata desse caso.
Causas frequentes no próprio site
- Permissões ou dono dos arquivos. Depois de um upload por SFTP, um backup restaurado ou uma troca de usuário do PHP, o servidor web não consegue ler os arquivos (
600em vez de644, pastas700em vez de755, dono diferente do usuário do servidor web). - Uma linha no
.htaccess.Deny from all,Require all denied, um bloqueio de IP largo demais ou uma regra copiada de um tutorial que fecha tudo. Vale também para os.htaccessdas subpastas. - Nenhum arquivo índice. A pasta não contém
index.htmlnemindex.phpeOptions -Indexesproíbe listar: o Apache responde 403 em vez de uma lista de arquivos. - ModSecurity ou o WAF. Uma regra do firewall de aplicação bloqueia um pedido que lhe parece suspeito: salvar um artigo com um trecho de código, um formulário com uma URL dentro, um upload.
- Firewall ou bloqueio geográfico. O painel da hospedagem, um plugin de segurança ou o fail2ban bloquearam seu IP depois de alguns logins errados, ou um país inteiro.
- Regras do Cloudflare. Uma regra WAF, um nível de segurança alto, um bloqueio de país ou um “challenge” que um bot (incluindo um serviço de monitoramento) não passa.
- Proteção contra hotlink. As imagens respondem 403 quando são chamadas de outro domínio, às vezes até do seu, se a regra não inclui todas as formas do domínio.
Se o site é seu: verifique primeiro
Abra o website down checker: ele diz se o 403 aparece também a partir do nosso local de verificação na Europa ou só para você. Só para você: é um bloqueio do seu IP ou da sua rede (causa 5 ou 6). De qualquer lugar: siga pelo log de erros, que quase sempre diz o motivo exato.
# Apache: o motivo do 403 está no log de erros
sudo tail -n 50 /var/log/apache2/error.log
# nginx
sudo tail -n 50 /var/log/nginx/error.log
# o arquivo é legível pelo servidor web?
ls -la /var/www/example.com/public/
namei -l /var/www/example.com/public/index.php
Como ler o log: client denied by server configuration indica uma diretiva de acesso no .htaccess ou no vhost; (13)Permission denied, as permissões dos arquivos; Directory index forbidden by Options directive, a pasta sem arquivo índice; ModSecurity: Access denied with code 403 com um id de regra, o WAF; no nginx, directory index of "/var/www/…" is forbidden ou open() … failed (13: Permission denied).
Soluções
1. Acertar permissões e dono
Para um site comum: arquivos 644, pastas 755, tudo pertencendo ao usuário com que rodam o servidor web ou o PHP (muitas vezes www-data, ou o seu usuário de hospedagem):
cd /var/www/example.com/public
sudo find . -type f -exec chmod 644 {} \;
sudo find . -type d -exec chmod 755 {} \;
sudo chown -R www-data:www-data .
Em uma hospedagem compartilhada, o painel do cliente costuma ter uma função “restaurar permissões”. Nunca 777: abre o site para qualquer um na mesma máquina.
2. Corrigir o .htaccess
Procure as linhas que negam acesso e comente ou restrinja:
grep -rn -iE "deny from|require all denied|require ip|order allow" /var/www/example.com/public --include=.htaccess
Se não souber de onde veio uma linha, renomeie o arquivo para .htaccess.off, recarregue a página e, se o 403 sumir, devolva as linhas uma por vez.
3. Acrescentar um arquivo índice ou permitir a listagem
Se a pasta deve mostrar uma página, acrescente index.html ou index.php, ou indique o nome certo com DirectoryIndex. Se ela deve listar os arquivos (uma pasta de downloads), troque Options -Indexes por Options +Indexes só naquela pasta.
4. ModSecurity e WAF: excluir a regra, não desligar tudo
Pegue o id da regra no log e desative só para o caminho que precisa:
<LocationMatch "/wp-admin/post.php">
SecRuleRemoveById 941100
</LocationMatch>
Em uma hospedagem compartilhada, o mesmo se faz pelo painel do cliente (seção ModSecurity ou WAF). Desligar o WAF para o site inteiro tira uma proteção útil: prefira uma exceção pontual.
5. Desbloquear o IP, o país ou o bot
Confira, nesta ordem: o plugin de segurança do WordPress (IPs bloqueados, bloqueio de países), o fail2ban no servidor (sudo fail2ban-client status, depois sudo fail2ban-client set nome-da-jail unbanip 203.0.113.5), o firewall do painel da hospedagem e, no Cloudflare, as regras WAF e o nível de segurança. Um serviço de monitoramento que precisa continuar verificando o site entra nas exceções pelo user agent ou pelos IPs, em vez de baixar a proteção para todo mundo.
6. Proteção contra hotlink
A regra precisa permitir todas as formas do seu domínio e os pedidos sem Referer:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?example\.com/ [NC]
RewriteRule \.(jpg|jpeg|png|gif|webp)$ - [F]
Se o problema está na sua hospedagem
Se o log não está acessível e as permissões e o .htaccess estão em ordem, o bloqueio está no painel, no WAF ou no firewall da hospedagem. Envie esta mensagem:
Prezados, desde aproximadamente 10h (UTC) meu site example.com responde “403 Forbidden” em todas as páginas, inclusive de redes diferentes. As permissões dos arquivos (644/755) e o .htaccess estão corretos e não alterei nada do meu lado. Vocês poderiam verificar se uma regra do ModSecurity, do firewall ou do bloqueio geográfico está bloqueando meu domínio, e me indicar a regra no log?
Para não acontecer de novo
Um 403 repentino vem quase sempre depois de uma ação: uma restauração, uma atualização de plugin de segurança, uma regra nova. Uma verificação HTTP vinda de fora percebe na primeira volta, porque 403 não é 200, e avisa antes dos visitantes. Para um site WordPress, a manutenção WordPress sob demanda acompanha atualizações, plugins e alertas de segurança, sem contrato. O site responde com um erro do servidor, e não com uma recusa? Leia o guia do erro 500 Internal Server Error.
Fora do ar? Nós resolvemos. No seu servidor ou em uma hospedagem compartilhada com acesso SSH, o Quick Fix, o reparo automático a preço fixo, corrige pequenos erros de configuração como permissões erradas ou uma linha a mais no .htaccess, com cópia de segurança antes, 24 horas por dia, inclusive nos fins de semana; o Deep Fix cuida de WAF, firewall e regras da aplicação, em blocos de 15 minutos; a estimativa é o valor máximo.
E agora
Verifique de fora
O site está fora do ar para todos ou só para você, e o que o servidor responde? Grátis, sem cadastro.
Verificador de site fora do arFora do ar? Nós resolvemos.
No seu servidor ou em uma hospedagem compartilhada com acesso SSH: Quick Fix a preço fixo para as causas mais comuns, Deep Fix cobrado em blocos de 15 minutos para todo o resto, 24/7. Preço visível antes do pedido.
Pedir um reparoOutros guias
- Site fora do ar: o que fazer nos primeiros 15 minutos
- Servidor fora do ar: o que verificar e em que ordem
- Erro 500 Internal Server Error: achar a causa nos logs e colocar o site de volta no ar
- Erro 502 Bad Gateway: achar a causa e resolver
- Erro 503: sobrecarga, manutenção ou limite da hospedagem?
- Erro 504 Gateway Timeout: achar o que está lento
- Erro 521 e 522 do Cloudflare: o servidor de origem não responde
- DNS_PROBE_FINISHED_NXDOMAIN: o domínio não responde mais
- ERR_CONNECTION_REFUSED: o servidor recusa a conexão
- ERR_CONNECTION_TIMED_OUT: o servidor não responde a tempo
- O que significa “Sua conexão não é particular” e como resolver
- ERR_SSL_PROTOCOL_ERROR: a conexão segura falha antes do certificado
- ERR_TOO_MANY_REDIRECTS: achar o loop de redirecionamentos e fechá-lo
- ERR_NAME_NOT_RESOLVED: o nome do site não é encontrado
- “Erro ao estabelecer conexão com o banco de dados” no WordPress: causa e solução