Uma URL absoluta carrega tudo: esquema, host, caminho e o resto. Uma URL relativa deixa partes de fora e espera que sejam preenchidas a partir de uma URL base, normalmente o endereço da página em que ela aparece. É isso que permite a um site linkar para about.html sem repetir o próprio domínio em todo lugar.
Os tipos de referência relativa
Quanto é preenchido depende da forma da referência:
- Caminho absoluto (
/help/index.html): mantém o esquema e o host da base, substitui o caminho inteiro. A barra inicial significa "a partir da raiz do site". - Caminho relativo (
page.html,./page.html,../page.html): resolvido em relação ao diretório da página atual../significa o diretório atual, e cada../sobe um nível antes de o resto do caminho ser aplicado. - Relativo ao esquema (
//cdn.example.com/lib.js): mantém apenas o esquema da base e assume um novo host. Em uma página https ele carrega por https; em http, por http. - Apenas query (
?page=2) e apenas fragmento (#section): mantêm tudo e mudam apenas a query ou o fragmento.
Por que isso importa
As regras de resolução (definidas na RFC 3986) são exatas, o que é bom, porque pequenos enganos produzem links quebrados: uma barra inicial ausente torna um link relativo ao diretório errado, e um ../ a mais sobe acima de onde você queria. Uma página também pode definir uma base explícita com uma tag <base>, que muda silenciosamente como cada link relativo da página resolve, uma fonte clássica de "por que este link está apontando para lá".
Há também um ângulo de segurança. Como ../ sobe pelo caminho, e como referências relativas ao esquema e ao caminho se comportam de formas diferentes, uma URL construída colando entrada de usuário em um caminho pode às vezes ser direcionada a algum lugar não intencional. Quando uma URL é montada a partir de partes em vez de escrita inteira, vale resolvê-la por completo para ver onde ela realmente cai.