Serveur HTTP Apache Version 2.4

Ce document explique comment le serveur HTTP Apache utilise l'URL contenue dans une requête pour déterminer le noeud du système de fichier à partir duquel le fichier devra être servi.

 Modules et directives concernés
 Modules et directives concernés Racine des documents (DocumentRoot)
 Racine des documents (DocumentRoot) Fichiers situés en dehors de
l'arborescence DocumentRoot
 Fichiers situés en dehors de
l'arborescence DocumentRoot Répertoires des utilisateurs
 Répertoires des utilisateurs Redirection d'URL
 Redirection d'URL Mandataire inverse (Reverse Proxy)
 Mandataire inverse (Reverse Proxy) Moteur de réécriture
 Moteur de réécriture Fichier non trouvé (File Not Found)
 Fichier non trouvé (File Not Found) Autres modules de mise en correspondance des
URLs
 Autres modules de mise en correspondance des
URLs| Modules Apparentés | Directives Apparentées | 
|---|---|
La méthode par défaut de httpd pour déterminer quel fichier servir pour
    une requête donnée, consiste à extraire le chemin du fichier de la requête
    (la partie de l'URL qui suit le nom d'hôte et le port), puis de l'ajouter
    à la fin de la valeur de la directive
    DocumentRoot définie dans vos fichiers
    de configuration.
    Ainsi, les fichiers et répertoires
    situés en dessous de DocumentRoot
    constituent l'arborescence de base des documents qui seront visibles
    depuis le web.
Par exemple, si la directive
    DocumentRoot contient
    /var/www/html, une requête pour
    http://www.example.com/fish/guppies.html retournera le
    fichier /var/www/html/fish/guppies.html au client.
Si la requête concerne un répertoire (autrement dit un chemin se
    terminant par un slash /), le nom du fichier qui sera
    recherché et servi depuis ce répertoire est défini via la directive
    DirectoryIndex. Par exemple,
    supposons que DocumentRoot ait été définie comme
    précédemment, et que vous ayez défini DirectoryIndex
    comme suit :
DirectoryIndex index.html index.php
Si httpd reçoit alors une requête pour
    http://www.example.com/fish/, il tentera de servir le
    fichier /var/www/html/fish/index.html. Si ce fichier
    n'existe pas, il tentera de servir le fichier
    /var/www/html/fish/index.php.
Si aucun de ces fichiers existe, httpd tentera de générer et
    d'afficher un index du répertoire, à condition que
    mod_autoindex ait été chargé et configuré pour le
    permettre.
httpd supporte aussi les Hôtes virtuels,
    ce qui lui permet de traiter des requêtes pour plusieurs hôtes.
    Dans ce cas, un DocumentRoot
    différent peut être défini pour chaque hôte virtuel;
    les directives fournies par le module
    mod_vhost_alias peuvent aussi être utilisées afin de
    déterminer dynamiquement le noeud approprié du système de fichiers
    à partir duquel servir un contenu en fonction de l'adresse IP
    ou du nom d'hôte.
La directive DocumentRoot  est
    définie dans le fichier de configuration de votre serveur principal
    (apache2.conf), mais peut aussi être redéfinie pour chaque
    Hôte virtuel supplémentaire que vous avez créé.
Il existe de nombreuses circonstances pour lesquelles il est nécessaire
    d'autoriser l'accès web à des portions du système de fichiers qui ne se
    trouvent pas dans l'arborescence DocumentRoot.  httpd propose de nombreuses
    solutions pour réaliser cela. Sur les systèmes Unix, les liens
    symboliques permettent de rattacher d'autres portions du système de
    fichiers au DocumentRoot. Pour des raisons de sécurité,
    httpd ne suivra les liens symboliques que si les Options pour le répertoire concerné contiennent
    FollowSymLinks ou SymLinksIfOwnerMatch.
Une autre méthode consiste à utiliser la directive Alias pour rattacher toute portion
    du système de fichiers à l'arborescence du site web. Par exemple, avec
Alias "/docs" "/var/web"
l'URL http://www.example.com/docs/dir/file.html
    correspondra au fichier /var/web/dir/file.html. La
    directive
    ScriptAlias
    fonctionne de la même manière, excepté que tout contenu localisé dans le
    chemin cible sera traité comme un script CGI.
Pour les situations qui nécessitent plus de flexibilité, vous disposez
    des directives AliasMatch
    et ScriptAliasMatch
    qui permettent des substitutions et comparaisons puissantes basées
    sur les expressions rationnelles.
    Par exemple,
ScriptAliasMatch "^/~([a-zA-Z0-9]+)/cgi-bin/(.+)" "/home/$1/cgi-bin/$2"
fera correspondre une requête du style
    http://example.com/~user/cgi-bin/script.cgi au chemin
    /home/user/cgi-bin/script.cgi, et traitera le fichier résultant
    comme un script CGI.
Sur les systèmes Unix, on peut traditionnellement faire référence
    au répertoire personnel d'un utilisateur particulier à l'aide de
    l'expression ~user/.
    Le module mod_userdir
    étend cette idée au web en autorisant l'accès aux fichiers situés dans les
    répertoires home des utilisateurs à l'aide d'URLs
    comme dans ce qui suit :
http://www.example.com/~user/file.html
Pour des raisons de sécurité, il est déconseillé de permettre un accès
    direct à un répertoire home d'utilisateur depuis le web. A cet effet, la
    directive UserDir
    spécifie un répertoire où sont situés les fichiers accessibles depuis le web
    dans le répertoire home de l'utilisateur.
    Avec la configuration par défaut
    Userdir public_html, l'URL ci-dessus correspondra à un fichier
    dont le chemin sera du style
    /home/user/public_html/file.html où
    /home/user/ est le répertoire home de l'utilisateur tel qu'il
    est défini dans /etc/passwd.
La directive Userdir met à votre disposition de nombreuses
    formes différentes pour les systèmes où /etc/passwd ne
    spécifie pas la localisation du répertoire home.
Certains jugent le symbole "~" (dont le code sur le web est souvent
    %7e) inapproprié et préfèrent utiliser une chaîne de
    caractères différente pour représenter les répertoires utilisateurs.
    mod_userdir ne supporte pas cette fonctionnalité. Cependant, si les
    répertoires home des utilisateurs sont structurés de manière rationnelle,
    il est possible d'utiliser la directive
    AliasMatch
    pour obtenir l'effet désiré. Par exemple, pour faire correspondre
    http://www.example.com/upages/user/file.html à
    /home/user/public_html/file.html, utilisez la directive
    AliasMatch suivante :
AliasMatch "^/upages/([a-zA-Z0-9]+)(/(.*))?$" "/home/$1/public_html/$3"
Les directives de configuration décrites dans les sections précédentes
    demandent à httpd d'extraire un contenu depuis un emplacement spécifique
    du système de fichiers
    et de la retourner au client. Il est cependant parfois
    souhaitable d'informer le
    client que le contenu demandé est localisé à une URL différente, et de
    demander au client d'élaborer une nouvelle requête avec la nouvelle URL.
    Ce processus se nomme redirection et est implémenté par la
    directive Redirect.
    Par exemple, si le contenu du répertoire /foo/ sous
    DocumentRoot est déplacé vers le
    nouveau répertoire /bar/, vous pouvez demander aux clients
    de le requérir à sa nouvelle localisation comme suit :
Redirect permanent "/foo/" "http://www.example.com/bar/"
Ceci aura pour effet de rediriger tout chemin d'URL commençant par
    /foo/ vers le même chemin d'URL sur le serveur
    www.example.com en remplaçant /foo/ par
    /bar/. Vous pouvez rediriger les clients non seulement sur le
    serveur d'origine, mais aussi vers n'importe quel autre serveur.
httpd propose aussi la directive RedirectMatch pour traiter les problèmes
    de réécriture d'une plus grande complexité. Par exemple, afin de rediriger
    les requêtes pour la page d'accueil du site vers un site différent, mais
    laisser toutes les autres requêtes inchangées, utilisez la
    configuration suivante :
RedirectMatch permanent "^/$" "http://www.example.com/startpage.html"
De même, pour rediriger temporairement toutes les pages d'un site vers une page particulière d'un autre site, utilisez ce qui suit :
RedirectMatch temp ".*" "http://othersite.example.com/startpage.html"
httpd vous permet aussi de rapatrier des documents distants dans l'espace des URL du serveur local. Cette technique est appelée mandataire inverse ou reverse proxying car le serveur web agit comme un serveur mandataire en rapatriant les documents depuis un serveur distant puis les renvoyant au client. Ceci diffère d'un service de mandataire usuel (direct) car, pour le client, les documents semblent appartenir au serveur mandataire inverse.
Dans l'exemple suivant, quand les clients demandent des documents situés
dans le répertoire
/foo/, le serveur rapatrie ces documents depuis le répertoire
/bar/ sur internal.example.com
et les renvoie au client comme s'ils appartenaient au serveur local.
ProxyPass "/foo/" "http://internal.example.com/bar/" ProxyPassReverse "/foo/" "http://internal.example.com/bar/" ProxyPassReverseCookieDomain internal.example.com public.example.com ProxyPassReverseCookiePath "/foo/" "/bar/"
La directive ProxyPass configure
le serveur pour rapatrier les documents appropriés, alors que la directive
ProxyPassReverse
réécrit les redirections provenant de
internal.example.com de telle manière qu'elles ciblent le
répertoire approprié sur le serveur local. De manière similaire, les directives
ProxyPassReverseCookieDomain
et ProxyPassReverseCookiePath
réécrivent les cookies élaborés par le serveur d'arrière-plan.
Il est important de noter cependant, que les liens situés dans les documents
ne seront pas réécrits.  Ainsi, tout lien absolu sur
internal.example.com fera décrocher le client
du serveur mandataire et effectuer sa requête directement sur
internal.example.com. Vous pouvez modifier ces liens (et
d'utres contenus) situés dans la page au moment où elle est envoyée au
client en utilisant le module mod_substitute.
Substitute "s/internal\.example\.com/www.example.com/i"
Le module mod_proxy_html rend possible une réécriture plus
élaborée des liens en HTML et XHTML. Il permet de créer des listes
d'URLs et de leurs réécritures, de façon à pouvoir gérer des scénarios
de réécriture complexes.
Le moteur de réécriture mod_rewrite peut s'avérer
    utile lorsqu'une substitution plus puissante est nécessaire.
    Les directives fournies par ce module peuvent utiliser des caractéristiques de la
    requête comme le type de navigateur ou l'adresse IP source afin de décider
    depuis où servir le contenu. En outre, mod_rewrite peut utiliser des
    fichiers ou programmes de bases de données externes pour déterminer comment
    traiter une requête. Le moteur de réécriture peut effectuer les trois types
    de mise en correspondance discutés plus haut :
    redirections internes (aliases), redirections externes, et services mandataires.
    De nombreux exemples pratiques utilisant mod_rewrite sont discutés dans la
    documentation détaillée de mod_rewrite.
Inévitablement, apparaîtront des URLs qui ne correspondront à aucun fichier du système de fichiers. Ceci peut arriver pour de nombreuses raisons. Il peut s'agir du déplacement de documents d'une localisation vers une autre. Dans ce cas, le mieux est d'utiliser la redirection d'URL pour informer les clients de la nouvelle localisation de la ressource. De cette façon, vous êtes sur que les anciens signets et liens continueront de fonctionner, même si la ressource est déplacée.
Une autre cause fréquente d'erreurs "File Not Found" est l'erreur de
    frappe accidentelle dans les URLs, soit directement dans le navigateur,
    soit dans les liens HTML. httpd propose le module
    mod_speling (sic) pour tenter de résoudre ce problème.
    Lorsque ce module est activé, il intercepte les erreurs
    "File Not Found" et recherche une ressource possédant un nom de fichier
    similaire. Si un tel fichier est trouvé, mod_speling va envoyer une
    redirection HTTP au client pour lui communiquer l'URL correcte.
    Si plusieurs fichiers proches sont trouvés, une liste des alternatives
    possibles sera présentée au client.
mod_speling possède une fonctionnalité particulièrement utile : il compare les noms de fichiers sans tenir compte de la casse. Ceci peut aider les systèmes où les utilisateurs ne connaissent pas la sensibilité des URLs à la casse et bien sûr les systèmes de fichiers unix. Mais l'utilisation de mod_speling pour toute autre chose que la correction occasionnelle d'URLs peut augmenter la charge du serveur, car chaque requête "incorrecte" entraîne une redirection d'URL et une nouvelle requête de la part du client.
mod_dir fournit la directive FallbackResource qui permet d'associer
    des URIs virtuels à une ressource réelle qui peut ainsi les servir.
    Cette directive remplace avantageusement
    mod_rewrite lors de l'implémentation d'un
    "contrôleur frontal".
Si toutes les tentatives pour localiser le contenu
    échouent, httpd
    retourne une page d'erreur avec le code de statut HTTP 404
    (file not found). L'apparence de cette page est contrôlée à l'aide de la
    directive ErrorDocument
    et peut être personnalisée de manière très flexible comme discuté dans le
    document
    Réponses personnalisées aux erreurs.
Les autres modules disponibles pour la mise en correspondance des URLs sont :
mod_actions - Met une URL en correspondance
    avec un script CGI en fonction de la méthode de la requête, ou du
    type MIME de la ressource.mod_dir - Permet une mise en correspondance
    basique d'un slash terminal dans un fichier index comme
    index.html.mod_imagemap - Met en correspondance une
    requête avec une URL en fonction de la zone d'une image intégrée à
    un document HTML dans laquelle un utilisateur clique.mod_negotiation - Sélectionne le document
    approprié en fonction de préférences du client telles que la langue
    ou la compression du contenu.