Back-End

23 nov, 2007

URLs amigáveis – Path para imagens, scripts e CSS

Publicidade

Olá, pessoal!

Após a postagem do artigo sobre URLs Amigáveis – Algumas Técnicas, recebi diversos e-mails com dúvidas de funcionamento dos scripts e, principalmente, de uma forma de facilitar a exibição de imagens e carregamento de scripts e folhas de estilo.

Tenho respondido essas dúvidas, na medida do possível, individualmente, mas sinto que é necessário aumentar a abrangência dos esclarecimentos.

Para isso, vou tomar como base dois exemplos distintos, rodando em servidor Apache sobre Windows, porém com a mesma solução. No primeiro, o sistema é desenvolvido na raiz do servidor. No segundo, o sistema é desenvolvido numa pasta dentro da raiz.

1º Exemplo:

www.meusite.com.br/

www.meusite.com.br/img/

www.meusite.com.br/scripts/

www.meusite.com.br/css/

2º Exemplo:

www.meusite.com.br/pasta/

www.meusite.com.br/pasta/img/

www.meusite.com.br/pasta/scripts/

www.meusite.com.br/pasta/css/

Localizando um arquivo na estrutura

Esse assunto é óbvio para alguns mas para a maioria não. Muita gente tem dificuldade em localizar arquivos numa estrutura de diretórios.

Suponha:

  1. Que existe o arquivo index.php dentro de www.meusite.com.br/pasta/.
  2. Que existe o arquivo logomarca.jpg dentro de www.meusite.com.br/pasta/img/.
  3. Que estamos com o trecho de código abaixo no arquivo www.meusite.com.br/pasta/index.php.

<img src=”/img/logomarca.jpg” title=”Logomarca” />

Ao carregarmos o arquivo index.php, veremos a imagem logomarca.jpg no navegador??

A resposta é não!

Na verdade, o caminho indicado no atributo src do elemento img aponta para um arquivo que não existe, pois aponta para www.meusite.com.br/img/logomarca.jpg.

Isso acontece pois a barra no início do caminho indica que o arquivo deve ser buscado na raiz do servidor. Não na pasta corrente.

Para consertar o “erro”, devemos alterar o trecho do código, deixando-o como abaixo:

<img src=”img/logomarca.jpg” title=”Logomarca” />

A ausência da barra indica que o caminho é relativo ao arquivo que está carregando a imagem. Isso significa que estamos apontando para www.meusite.com.br/pasta/img/logomarca.jpg.

Pode parecer óbvio, como disse, mas isso causa muito mais dúvida do que se imagina.

A solução

A solução que proponho – e que utilizo – é extremamente simples. Normalmente, os desenvolvedores utilizam um arquivo de configuração de parâmetros, funções gerais, autoload de classes, etc. Eu chamo esse arquivo de init.php.

Se você não tem um arquivo como esse, sugiro como o crie.

Coloque no arquivo o seguinte trecho:

$root = dirname( $_SERVER["PHP_SELF"] ) == DIRECTORY_SEPARATOR ? "" : dirname( $_SERVER["PHP_SELF"] );
define( "ROOT", $root );

Na primeira linha, temos uma condicional contracta. Isso quer dizer que a primeira linha pode ser substituída por:

if ( dirname( $_SERVER["PHP_SELF"] ) == DIRECTORY_SEPARATOR ) {
    $root = "";
} else {
    $root = dirname( $_SERVER["PHP_SELF"] );
}

A constante padrão predefinida DIRECTORY_SEPARATOR recebe o valor “\” ou “/”, dependendo do sistema operacional do servidor.

Se considerarmos o 1º exemplo, $_SERVER[“PHP_SELF”], que é uma variável predefinida, terá o valor /index.php.

Nesse caso, a função dirname retorna “\”.

Se considerarmos o 2º exemplo, $_SERVER[“PHP_SELF”] terá o valor /pasta/index.php.

Nesse caso, a função dirname retorna “/pasta”.

Assim, na plataforma testada, teremos:

  1. No primeiro exemplo, ROOT = “.
  2. No segundo exemplo, ROOT = “/pasta”.

Agora, se incluirmos o arquivo init.php – como eu chamo – no arquivo index.php e mudarmos o trecho do elemento img para…

<img src=”<?php echo ROOT;?>/img/logomarca.jpg” title=”Logomarca” />

…a imagem será carregada nos dois casos. Independente de onde tiver o arquivo index.php, na estrutura de pastas.

Isso acontece com as URLs Amigáveis porque podemos consider que, de certo ponto de vista, seu funcionamento é semelhante ao deslocamento da página carregada para uma pasta do servidor.

Mas e os scripts, folhas de estilo, templates, etc?

A solução é exatamente a mesma.

Espero que esse artigo esclareça esse assunto que é óbvio para alguns, mas obscuro para uma grande parcela dos desenvolvedores iniciantes.

Abraços!