Resolver problemas

Erro 404 em imagens, CSS ou JS com o caminho correto

Revisto a 4 min de leitura erros HTTP ficheiros estáticos

Por vezes, liga uma imagem, um ficheiro CSS ou um JavaScript, tem a certeza de que o caminho está correto e, mesmo assim, o servidor responde que não o encontra (erro 404). Estas são as causas mais frequentes, da mais simples para a menos simples.

O URL não é exatamente o que pensa

Abra o site, prima F12, entre no separador Rede e recarregue. Clique no ficheiro que falha para ver o URL completo que o navegador pede. Compare-o com a localização real do ficheiro no gestor de ficheiros:

  • Maiúsculas e minúsculas: no servidor, Logo.png e logo.png são ficheiros diferentes, mesmo que no seu computador funcione.
  • Pasta do domínio: o ficheiro tem de estar dentro da pasta desse domínio (public_html ou a do domínio adicional), e não noutra.
  • Caminhos dentro de um CSS: um caminho relativo como url(img/fondo.jpg) dentro de um CSS é procurado a partir da pasta do CSS, e não da página.
  • Ficheiros com versão ou hash (app.3f9a1c.js): depois de atualizar o site, a página pode continuar a pedir o ficheiro antigo que já apagou. Esvazie a cache da aplicação e, se usar uma CDN, a da CDN.

Problema de permissões

Verifique se as pastas, as subpastas e os próprios ficheiros têm permissões 755 nas pastas e 644 nos ficheiros. Pode alterá-las a partir do gestor de ficheiros do cPanel com o botão direito > Change Permissions. Nunca use 777: não é necessário e explicamo-lo em porque não precisa de permissões 777.

O framework interceta os pedidos

Frameworks e aplicações como Laravel, Symfony ou CodeIgniter enviam todos os pedidos para o seu index.php através de regras do .htaccess, e essas regras afetam também todas as subpastas. Se as regras não excluírem os ficheiros que existem, o framework responde 404 às suas imagens ou CSS.

Abra o .htaccess da raiz do site e verifique se, antes da regra que envia tudo para index.php, estão estas duas condições:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]

Com elas, se o ficheiro ou a pasta existirem, o servidor entrega-os diretamente. As versões atuais dos frameworks já as incluem; o problema costuma surgir em versões antigas ou em .htaccess modificados manualmente.

Se não puder mexer nesse .htaccess, crie outro dentro da pasta onde estão os ficheiros estáticos que falham, com esta linha no início:

RewriteEngine Off

Assim desativa as regras de reescrita apenas nessa pasta, e o resto do site continua a funcionar da mesma forma.

Bloqueio do ModSecurity (erro 403)

Se, no separador Rede, o erro não for 404 mas 403, o mais provável é que a firewall ModSecurity esteja a bloquear o ficheiro por engano, por exemplo pelo seu nome ou pelos parâmetros do URL. Desative-a por um momento para o domínio, recarregue a página e volte a ativá-la logo a seguir.

Se, com o ModSecurity desativado, o ficheiro carregar, escreva-nos com o URL exato e a hora: criaremos uma exceção apenas para essa regra e esse caminho, e assim não terá de o deixar desativado.

Também lhe pode ser útil

Algo não bate certo ou mudou? Diga-nos e revemos.