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 fragmentSource : 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)
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
http://www.toto.fr/blog/posts/243.html?order=newest#tople navigateur (ou autre client web) la découpe en morceaux pour identifier
www.toto.fr
/blog/posts/243.html?order=newest
#top
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).
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 »
/
)
correspond à un répertoire fixé de son système de fichiers,
appelé « web root » ou « document root »
/var/www/html
sous Linux
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/
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)
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.
<link rel="stylesheet" href="http://megastyle.com/style.css" />
GET /style.css
au serveur megastyle.com
, et interprète le résultat comme du CSS pour mettre en forme la page
<img src="http://un-site.fr/photos/foobar.jpg" alt="ma photo" />
GET /photos/foobar.jpg
au serveur un-site.fr
, et récupère en réponse une imageIl 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)
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
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.