URL é a sigla para “Uniform Resource Locator”. Cada URL aponta para algum conteúdo único na Web (como uma página web, um documento CSS, uma imagem etc.) - desde que a URL seja válida, claro.
Toda URL segue a seguinte estrutura: Protocolo
+ Domínio
(+ Porta
) + Caminho até arquivo/recurso
Ex.: https://www.example.com:443/path/to/resource.html
A porta costuma estar omitida. Nesses casos, o browser considera que serão utilizadas portas padrões de acordo com o tipo de protocolo (ex.: HTTP: 80, HTTPS: 443).
Além disso, é possível que a URL também contenha parâmetros que serão passados para o servidor - que seguem a forma: param1=teste¶m2=123
- e tags que identificam certo ponto de um documento HTML - vêm ao final da URL, após #
. Ex.: https://www.example.com:3000/file_path/resource?user=admin&passwd=1234#anchor
URL Structure
https:// www.example.com:3000/file_path/resource?user=admin&passwd=1234#anchor
Define o tipo de protocolo que será usado na comunicação entre o navegador e o servidor, ou seja, como os dados serão enviados e recebidos. Alguns deles (os que mais aparecem) são: 1. http:// (Hypertext Transfer Protocol) 2. https:// (Hypertext Transfer Protocol Secure) 3. file:// (indica um arquivo local - no seu HD ou compartilhado em LAN) 4. ftp:// (File Transfer Protocol)
https:// www.example.com :3000/file_path/resource?user=admin&passwd=1234#anchor
Representa aonde o website pode ser encontrado. Ele pode ser tanto o endereço IP do servidor (IPv4: 32 bits ou IPv6: 128 bits) quanto um nome de domínio mais “human-friendly”. O Google, por exemplo pode ser acessado por www.google.com
ou por 216.58.205.46
(IPv4 do Google). No primeiro caso, servidores DNS convertem www.google.com
em 216.58.205.46
, pois só assim ele será encontrado na rede.
https://www.example.com :3000 /file_path/resource?user=admin&passwd=1234#anchor
É o número da porta do servidor Web. Representa em que porta da máquina está “rodando” o recurso buscado. Uma mesma máquina (ou servidor) pode rodar diversos serviços em diferentes portas. Por padrão, a porta do protocolo HTTP é 80 e a do protocolo HTTPS é 443, então quando se usa estes protocolos, muitas vezes não é preciso evidenciar a porta pois ela já está implicita.
https://www.example.com:3000 /file_path/resource ?user=admin&passwd=1234#anchor
Representa o caminho dentro do servidor até o recurso buscado. Ele começa sempre com um “forward slash” (/
) e pode passar por diversas “pastas” - todas separadas por /
ao descrever o caminho. Por fim, tem-se o nome do recurso procurado. Por exemplo: em www.teste.com/2019/usuarios/usuario_1.html
, buscamos a página usuario_1.html
, que está dentro de usuarios
que está dentro de 2019
. A palavra “pasta” está entre aspas porque, atualmente, esse caminho não necessariamente representa uma sequência de pastas que existe no servidor. Frequentemente, isso é só uma abstração criada para ajudar no server-side.
Obs.: No caso desse caminho ser uma sequência de pastas, as vezes é possível voltar para pastas externas da mesma forma que fazemos em sistemas UNIX ou no próprio Windows:
www.sitebemvulneravelmesmo.com/../../../../../etc/passwd
Se não há medidas de preucaução, o uso de (../
) deixa a página possivelmente vulnerável a Directory Transversal.
https://www.example.com:3000/file_path/resource ?user=admin&passwd=1234 #anchor
Esses parâmetros são informações que serão passadas ao servidor. Eles vem na forma chave-valor: nome_parametro=valor
. Caso haja mais de um parâmetro, usa-se como separador o &
. Na URL, os parâmetros vêm após um ponto de interrogação (?
).
https://www.example.com:3000/file_path/resource?user=admin&passwd=1234 #anchor
Esse elementos da URL é utilizado para indicar um ponto específico na página para o qual o navegador deve ir imediatamente. Esse identificador pode apontar para um elemento no HTML (como um <a name="anchor_reference_name">
) ou para um momento específico de um vídeo/aúdio. Esses identificadores não são enviados para o servidor em requisições.
Existem caractéres chamados de reservados, os quais têm algum significado especial nas URLs. A barra (/
), por exemplo, separa elementos na URL (como o caminho até o recurso buscado). De forma similar, existem caractéres considerados inseguros, os quais, apesar de não terem significado especial nas URLs, podem significar algo no contexto em que a URL está escrita (ex.: dentro de um elemento HTML, em trechos de código Javascript/PHP etc.) - é o caso das aspas duplas ("
). O tratamento incorreto/descuidado desses elementos pode levar a brechas de segurança.
Em ambos os casos, a saída para utilizar esses caractéres sem confundir o browser (ou às vezes querendo confundí-lo) é encodá-los. Para isso serve URL Enconding. A barra, por exemplo, torna-se %2F
e as aspas duplas tornam-se %22
. Em geral, os caractéres encodados seguem a forma: %
+ número em hexadecimal
(dois digitos para UTF-8).
Apesar de isso ser utilizado para esses caractéres “especiais”, muitos outros podem ser encodados, como podemos ver nessas tabelas.