Uma gramática para toda URL

Uma URL parece texto livre, mas tem uma gramática estrita, definida pela 3986 como um Uniform Resource Identifier. Uma vez que você conhece as cinco partes de nível superior, toda URL fica fácil de ler, e um parser consegue separar qualquer uma delas com um único padrão. Tome este exemplo e mantenha-o em mente conforme as partes são apresentadas:

https://user@host.example.com:8443/path/to/page?q=hello&lang=en#section

As cinco partes, em ordem, são o esquema, a autoridade, o caminho, a query e o fragmento. A pontuação entre elas é o que um parser usa como referência: os dois pontos após o esquema, a barra dupla que introduz a autoridade, o ponto de interrogação que inicia a query e a cerquilha que inicia o fragmento.

Esquema

O esquema vem primeiro, antes dos dois pontos: https. Ele nomeia o protocolo ou a interpretação para o resto da URL, e é insensível a maiúsculas, então HTTPS e https significam a mesma coisa e normalmente são escritos em minúsculas. Esquemas comuns incluem http e https, mas também ftp, ssh, mailto e tel. Alguns esquemas usam uma autoridade e outros não: mailto:someone@example.com tem um esquema e então pula direto para um caminho sem host.

Autoridade: userinfo, host e porta

Se a URL tem uma barra dupla após o esquema, o que vem em seguida até a próxima barra, interrogação ou cerquilha é a autoridade. Ela se divide em três pedaços. O userinfo, antes de um arroba, pode carregar um usuário e opcionalmente uma senha: user@ aqui, ou user:password@ quando há uma senha. Embutir uma senha dessa forma é desencorajado, porque URLs são registradas e compartilhadas. O host é a máquina: um nome de domínio como host.example.com, um literal IPv4, ou um literal IPv6 entre colchetes como [2001:db8::1]. A porta, após dois pontos, é a porta TCP: 8443. Quando a porta é omitida, o cliente usa o padrão do esquema, como 443 para https ou 80 para http.

Caminho, query e fragmento

O caminho identifica o recurso no host: /path/to/page. É uma sequência de segmentos separados por barras, e um inspetor pode listar esses segmentos individualmente. A query, introduzida por um ponto de interrogação, carrega parâmetros: q=hello&lang=en. Sua estrutura interna é uma convenção que merece o próprio artigo sobre query strings. O fragmento, introduzido por uma cerquilha, aponta dentro do recurso: section. O fragmento é especial em um aspecto importante: ele é tratado inteiramente pelo cliente e nunca é enviado ao servidor, e por isso é um bom lugar para manter dados que você não quer nos logs do servidor.

Por que ler as partes separadamente

O valor de ver uma URL dividida nessas partes nomeadas é que erros sutis se tornam óbvios. Uma senha escondida no userinfo, uma porta não padrão, um host que na verdade é um endereço IP, um parâmetro enterrado em uma query longa: todos eles se destacam quando a URL é decomposta. O inspetor de URL faz exatamente essa decomposição, fielmente e sem normalizar a URL, então o que você vê é o que a URL realmente diz.

Esta série, em ordem

Este artigo abre a série URLs lidas ao pé da letra. Com as cinco partes nomeadas, a série lê o resto da gramática em ordem (os nomes da coisa, o escape, a query, a resolução, os hosts internacionais, onde um domínio é registrado) e termina com os truques que dependem de um leitor que não lê com essa exatidão.

  1. URI, URL, URN: qual é mesmo a diferença?. Identificar, localizar, nomear: o que as três siglas significam numa especificação e numa conversa.
  2. Codificação por porcentagem (codificação de URL), explicada. Por que uma URL escreve alguns caracteres como %XX, quais podem ficar como estão e como isso difere do .
  3. Query strings: parâmetros, sinais de mais e chaves repetidas. Separadores, o sinal de mais que às vezes significa espaço, chaves repetidas e por que nenhum padrão único as governa.
  4. URLs relativas e como elas resolvem. Como um navegador completa um link relativo contra a sua base, e o que ./, ../ e uma barra inicial fazem.
  5. Codificação de URL e hosts internacionalizados. Codificação por porcentagem para caminhos e queries, punycode para nomes de host, e por que hosts internacionalizados servem ao phishing.
  6. Sufixos públicos e o domínio registrado (eTLD+1). O sufixo público e o domínio registrado (eTLD+1), por que os dois últimos rótulos são a resposta errada e onde isso decide cookies e certificados.
  7. URLs enganosas: como enxergar além dos truques. O truque do userinfo, os parâmetros de redirecionamento e os caracteres sósias, e o único hábito que encontra o host real.
  8. Truques de ofuscação de endereço IP. Um endereço escrito em decimal, octal, hexadecimal ou IPv6 mapeado de IPv4, e por que um filtro precisa decodificar em vez de comparar strings.