-1

O HTML funciona localmente, mas perde imagens no link? Seis testes de URL

Uma imagem que aparece no computador pode sumir quando o HTML é publicado em um subdiretório. Antes de trocar de hospedagem, vale conferir qual endereço o navegador está tentando carregar.

Estou desenvolvendo o Plopino, uma ferramenta para compartilhar páginas HTML por link. O problema abaixo é relevante nesse contexto, mas a explicação e os testes também servem para outros serviços de hospedagem estática.

A barra muda o destino

Considere esta estrutura:

index.html
assets/
  logo.svg
  site.css
pages/
  details.html

Se a página está em https://example.com/b/demo/, o caminho /assets/logo.svg aponta para a raiz do domínio. Já ./assets/logo.svg aponta para a pasta assets dentro de /b/demo/.

Outro detalhe: /b/demo e /b/demo/ não são a mesma base para resolver uma referência relativa. O servidor pode redirecionar uma forma para a outra, mas é preciso conferir o endereço final no navegador.

Seis casos reproduzíveis

Salve como check-paths.mjs e execute com Node.js:

import assert from 'node:assert/strict';

const cases = [
  ['https://example.com/b/demo/', '/assets/logo.svg', '/assets/logo.svg'],
  ['https://example.com/b/demo/', './assets/logo.svg', '/b/demo/assets/logo.svg'],
  ['https://example.com/b/demo/', 'assets/logo.svg', '/b/demo/assets/logo.svg'],
  ['https://example.com/b/demo/pages/details.html', '../assets/logo.svg', '/b/demo/assets/logo.svg'],
  ['https://example.com/b/demo/assets/site.css', './logo.svg', '/b/demo/assets/logo.svg'],
  ['https://example.com/b/demo', './assets/logo.svg', '/b/assets/logo.svg'],
];

for (const [base, reference, expected] of cases) {
  const actual = new URL(reference, base).pathname;
  assert.equal(actual, expected);
  console.log(reference + ' + ' + base + ' => ' + actual);
}
console.log(cases.length + ' URL checks passed');

Executei os seis casos acima e a saída final foi 6 URL checks passed. Eles cobrem caminhos a partir da raiz, caminhos relativos, uma página em uma subpasta, uma folha de estilos externa e uma base sem a barra final.

No CSS externo, referências relativas dentro de url() usam a URL da própria folha de estilos como base. No HTML com um elemento base, também é necessário conferir document.baseURI: a URL da página pode não ser a base efetiva.

Limite do teste: isso verifica o cálculo das URLs. Não comprova que os arquivos existem, que o servidor permite acessá-los ou que as imagens renderizam.

Depois do cálculo, confira a resposta

Na aba Network do navegador, selecione a requisição que falhou e compare:

  • Caminho diferente do esperado: confira a barra inicial, a base efetiva e a pasta da página ou do CSS.
  • Caminho correto com 404: compare a estrutura enviada e as letras maiúsculas/minúsculas do nome do arquivo.
  • Status 200 com uma página HTML: examine o corpo da resposta e o Content-Type. Uma página de fallback não é o SVG ou CSS solicitado.
  • Redirecionamento para login ou acesso negado: investigue a permissão de compartilhamento separadamente do caminho do recurso.

Alterar uma causa por vez ajuda a não misturar um problema de URL com outro de arquivos ou permissões.

Teste o que o destinatário vai receber

Abra o link final em um navegador sem login. Confira uma imagem, uma interação importante e o layout em uma janela estreita. O preview local não demonstra o que outra pessoa consegue acessar.

Também vale enviar uma pergunta específica junto do link: “Esta é a versão de 9 de outubro. Selecione o pacote completo e confira se os itens de entrega correspondem ao escopo.” Se a página puder ser atualizada mantendo o endereço, registre a versão revisada separadamente quando isso for importante. Um link estável não é um registro de aprovação.

Referência: MDN — resolução de referências relativas.

Texto organizado com auxílio de IA. As seis asserções de URL foram executadas; o exemplo não representa um teste completo de hospedagem nem um caso de cliente.

Carregando publicação patrocinada...