URL, chemins, requêtes

Alexandre Niveau
GREYC — Université de Caen

URL

Le web est un ensemble de ressources (documents — ou autre !), liées entre elles

Chaque ressource a une adresse (ce qui permet de la récupérer, et de la lier à d'autres ressources)

Les adresses sont appelées URL (ou plus généralement URI)

La syntaxe des URL a été créée pour le web, mais est utilisée dans de nombreux autres contextes

            userinfo          host        port
        ┌───────┴───────┐ ┌────┴────────┐ ┌┴┐
 http://john.doe:password@www.example.com:123/forum/questions/?tag=networking&order=newest#top
 └─┬─┘  └───────────┬───────────────────────┘└─┬─────────────┘└────────┬─────────────────┘└┬─┘
 scheme         authority                      path                  query              fragment

Source : Wikipédia

La partie « scheme » indique le protocole à utiliser pour récupérer la ressource

La partie « authority » indique à qui il faut s'adresser pour récupérer la ressource

La partie « path » indique le chemin vers la ressource sur le serveur

La partie « query » permet d'indiquer des paramètres (pour filtrer ou mettre en forme la ressource)

La partie « fragment » identifie une sous-partie de la ressource (par exemple une section d'une page HTML)

Autres exemples de la syntaxe URI

Parenthèse sur les chemins

Les données d'un ordinateur sont organisées en un système de fichiers, qui comporte
  • des fichiers, c'est-à-dire des suites de bits qui représentent quelque chose : une image, un texte, une vidéo, etc.
  • des répertoires (directories, terme du monde UNIX) ou dossiers (folders, terme du monde Windows), qui peuvent contenir des fichiers et/ou d'autres répertoires
Les systèmes de fichiers courants forment une arborescence :
  • chaque fichier/répertoire n'a qu'un seul répertoire parent
  • il y a un répertoire spécial, la racine (root — à ne pas confondre avec l'utilisateur root !), qui n'a pas de répertoire parent

Par exemple, sous Windows, on aura une racine C:, avec dedans notamment des dossiers Program Files et Users, dans ce dernier un dossier Toto avec dedans des fichiers photo.jpg, musique.mp3 et d'autres dossiers… TODO faire un dessin

Chaque fichier ou répertoire est identifié par un chemin à partir de la racine, par exemple C:\Users\Toto\photo.jpg

Dans le monde UNIX le séparateur de chemin est le slash /, et la racine est simplement / : un chemin équivalent au précédent pourra être /home/toto/photo.jpg

c'est cette syntaxe qui est utilisée dans les URL

Requête HTTP

Pour récupérer la ressource située à une URL donnée, par exemple
http://www.toto.fr/blog/posts/243.html?order=newest#top
le navigateur (ou autre client web) la découpe en morceaux pour identifier
  • le protocole, ici HTTP
  • l'hôte, ici www.toto.fr
  • le chemin et les éventuels paramètres, ici /blog/posts/243.html?order=newest
  • le fragment, ici #top
Il va ensuite faire une requête HTTP vers la machine nommée www.toto.fr (après avoir récupéré son adresse IP via un serveur DNS) avec comme contenu
GET /blog/posts/243.html?order=newest HTTP/1.1
Host: www.toto.fr
(et sans doute d'autres champs d'en-tête).
NB:
  • la cible de la requête GET est l'ensemble chemin+paramètres
  • le fragment n'apparaît pas dans la requête — le client demande toujours la ressource entière, et ira chercher tout seul le fragment dans la réponse reçue.

Rôle du serveur web

Il existe de nombreux serveurs web (au sens logiciel), les plus utilisés étant Apache et nginx

Rôle du programme serveur : reçoit des requêtes HTTP et renvoie des réponses HTTP (qui peuvent contenir n'importe quoi)

En pratique, on a souvent besoin que les URL correspondent à des fichiers

un des rôles principaux du programme serveur est d'interpréter le chemin demandé dans la requête comme un chemin dans le système de fichiers

Interprétation pas directe ! On ne veut pas que tout le système de fichiers de la machine soit accessible sur le web…

le chemin demandé est « traduit »

Traduction d'un chemin par le serveur web

Typiquement, le serveur considère que la racine de l'URL (chemin /) correspond à un répertoire fixé de son système de fichiers, appelé « web root » ou « document root »
  • souvent /var/www/html sous Linux
  • quelque chose comme C:\Program Files\Apache\htdocs sous Windows

La « traduction » est plus ou moins une simple concaténation des chemins : la requête HTTP

GET /bidule/truc/machin.html?blabla=blibli
sera interprétée comme correspondant au fichier suivant sur le serveur :
/var/www/html/bidule/truc/machin.html
(les paramètres ne font pas partie du chemin : ce qu'en fait le serveur dépend de sa configuration)

On dit que le serveur web « sert » le contenu du répertoire /var/www/html à la racine du site

Exemple : le serveur web de la fac sert le contenu du répertoire /users/durand222/www-dev à la racine du site https://dev-durand222.users.info.unicaen.fr/

Servir un fichier / un répertoire

Si le chemin traduit correspond à un fichier (HTML, ou image, PDF, audio…), c'est lui que le serveur envoie en réponse.

Si le chemin traduit ne correspond à rien, le serveur enverra une erreur 404 (on peut configurer ce comportement)

Si le chemin correspond à un répertoire, le serveur regarde s'il contient un fichier index.html

si oui, c'est ce fichier qu'il sert

sinon, ça dépend de la configuration : il peut renvoyer une 404, une 403, ou générer une page pour montrer le contenu du répertoire (c'est ce qui passe sur votre espace web de la fac)

Utilisation des URL sur le web

Les URL sont utilisées pour faire des liens hypertextes dans une page :

<a href="http://example.org">ceci est un lien</a>

quand on clique dessus, le navigateur fait une requête à l'URL donnée

… mais aussi pour faire la liaison entre une page et les ressources dont elle a besoin : images, feuilles de style, vidéos, scripts, etc.

Comment ça marche :
  1. le client fait une première requête HTTP, et récupère une page HTML
  2. il analyse le HTML, construit l'arbre DOM, et commence à afficher la page
  3. pendant l'analyse, il trouve l'élément suivant :
    <link rel="stylesheet" href="http://megastyle.com/style.css" />
  4. il fait alors une nouvelle requête HTTP, en utilisant l'URL donnée, c'est-à-dire une requête GET /style.css au serveur megastyle.com , et interprète le résultat comme du CSS pour mettre en forme la page
  5. il continue son analyse et trouve l'élément suivant :
    <img src="http://un-site.fr/photos/foobar.jpg" alt="ma photo" />
  6. il fait une nouvelle requête HTTP, cette fois GET /photos/foobar.jpg au serveur un-site.fr, et récupère en réponse une image
  7. lorsque le téléchargement de l'image est terminé, il l'affiche au bon endroit dans la page

Il faut souvent de nombreuses requêtes HTTP pour afficher une seule page !

On peut les voir avec l'inspecteur réseau de Firefox (Ctrl-Shift-E)

URL relatives

Les attributs href et src n'ont pas besoin d'une URL absolue (complète)

On peut mettre une URL relative (partielle), qui sera complétée par le navigateur en utilisant l'URL de la page courante

on parle de résolution de l'URL relative

Exemples d'URL relatives, en supposant qu'on est sur la page d'URL http://example.org/fr/articles/456.html :
  • //autre-site.com/toto/titi est une URL dont le protocole est implicite ; le navigateur choisira le protocole utilisé pour charger la page courante (HTTP ou HTTPS) ⇒ ici http://autre-site.com/toto/titi
  • /en/posts/243.html est une URL dont le protocole et l'hôte sont implicites ; le navigateur utilisera le protocole et l'hôte de l'URL courante ⇒ ici http://example.org/en/posts/243.html
  • 871.html est une URL dont le protocole et l'hôte sont implicites et le chemin ne commence pas à la racine (chemin relatif) ; le navigateur utilisera le protocole, l'hôte, et le chemin de l'URL courante ⇒ ici http://example.org/fr/articles/871.html

Les chemins relatifs contiennent parfois un composant .. : il permet d'accéder au répertoire parent

Dans notre exemple, l'URL ../users/3987.html est résolue en http://example.org/fr/users/3987.html

NB : c'est le client qui s'occupe de la résolution. Une fois l'URL complète reconstituée, il fait une requête HTTP normale.