<-
Apache > Serveur HTTP > Documentation > Version 2.0

N�gociation de Contenus

Langues Disponibles:  en  |  fr  |  ja  |  ko 

Apache suit les sp�cifications HTTP/1.1 en ce qui concerne les n�gociations de contenus. Il est ainsi possible d'utiliser les informations fournies par le navigateur (pr�f�rences de langues, jeu de caract�res, encodage et types de m�dias). Apache essaye aussi d'optimiser les cas des navigateurs envoyant des informations incompl�tes.

C'est le module mod_negotiation qui fournit la n�gociation de contenus ; ce module est inclus dans Apache par d�faut.

top

� propos de la N�gociation de Contenus

Diff�rentes repr�sentations peuvent �tre utilis�es pour communiquer une ressource. Par exemple, plusieurs langues peuvent �tre disponibles, ou plusieurs types de m�dias, voire parfois une combinaison de ces possibilit�s. Une m�thode pour g�rer cela est de donner le choix au visiteur, en lui proposant un index g�n�ral, qui lui permet par exemple de choisir sa langue. Cependant, il est souvent possible de faire ce choix de mani�re automatique car les navigateurs peuvent pr�ciser avec leurs requ�tes, la repr�sentation qu'ils pr�f�rent recevoir. Par exemple, un navigateur pourrait sp�cifier qu'il pr�f�re recevoir les informations en fran�ais si elles sont disponibles, ou en anglais dans le cas contraire. Ce type d'information est communiqu� par les navigateurs, dans les en-t�tes de chaque requ�te. Un navigateur ne demandant que des documents en fran�ais enverrait

Accept-Language: fr

Notez que cette pr�f�rence ne sera g�r�e par le serveur que s'il existe un choix de langues du c�t� du serveur.

Voici un exemple plus complet, o� le navigateur est configur� pour accepter le fran�ais et l'anglais, mais avec une pr�f�rence pour le fran�ais, et pour accepter divers types de m�dias, en pr�f�rant le HTML au texte brut, et en pr�f�rant le GIF ou le JPEG aux autres types de m�dias (sans pour autant refuser ces derniers, le cas �ch�ant) :

Accept-Language: fr; q=1.0, en; q=0.5
Accept: text/html; q=1.0, text/*; q=0.8, image/gif; q=0.6, image/jpeg; q=0.6, image/*; q=0.5, */*; q=0.1

Apache supporte les n�gociations de contenus 'g�r�s par le serveur', telles que sp�cifi�es dans HTTP/1.1. Les en-t�tes Accept, Accept-Language, Accept-Charset et Accept-Encoding sont g�r�s. Apache supporte �galement les n�gociations de contenus 'transparentes', telles que d�finies dans les RFC 2295 et 2296. En revanche les fonctions de 'feature negotiation' d�finies dans ces RFCs ne sont pas support�es.

On appelle ressource une entit� conceptuelle identifi�e par un URI (RFC 2396). Le travail d'un serveur HTTP, tel Apache, est de donner un acc�s � des repr�sentations des ressources � sa disposition, chaque repr�sentation �tant envoy�e sous la forme d'une s�quence d'octets d�finie selon un type de m�dia, un jeu de caract�res, un encodage, etc. � tout moment, chaque ressource est associ�e � z�ro, une ou plusieurs repr�sentations. Si plusieurs repr�sentations sont disponibles pour une ressource, on dit que cette derni�re est n�gociable et chacune de ses repr�sentations possibles est appel�e une variante. Les diff�rentes possibilit�s de choisir les variantes d'une ressource n�gociable sont appel�es dimensions de la n�gociation.

top

N�gociations avec Apache

Pour qu'Apache puisse proc�der � la n�gociation d'une ressource, il faut qu'il dispose d'informations � propos de chacune des variantes. Deux m�thodes sont possibles :

Utilisation d'une Table de Types (Type Map)

Une table de types est un document qui est associ� avec le gestionnaire type-map (ou, dans les plus anciennes versions d'Apache, le type mime application/x-type-map). Notez que pour impl�menter cette m�thode, un 'handler' doit �tre d�fini dans la configuration pour associer une extension de fichier � type-map ; ce qui est g�n�ralement obtenu au moyen de

AddHandler type-map .var

dans le fichier de configuration du serveur.

Les fichiers de table de types portent g�n�ralement le nom de la ressource qu'ils d�crivent, et contiennent une entr�e correspondant � chaque variante possible ; ces entr�es sont constitu�es de lignes au format d'en-t�tes HTTP. Les entr�es de deux variantes distinctes sont � s�parer par des lignes vides. Il n'est pas permis d'utiliser des lignes vides au sein d'une entr�e. Il est courant de placer en d�but de fichier une entr�e pour l'entit� combin�e dans son ensemble (bien que cela ne soit pas n�cessaire, et ignor� par Apache). Un exemple de fichier de table est donn� en exemple ci-apr�s. Le nom de ce fichier serait foo.var, puisque le fichier d�crit une ressource appel�e foo.

URI: foo

URI: foo.en.html
Content-type: text/html
Content-language: en

URI: foo.fr.de.html
Content-type: text/html;charset=iso-8859-2
Content-language: fr, de

Notez que les fichiers de table de types sont toujours utilis�s en priorit� par Apache par rapport � l'extension du nom du fichier, et ce m�me si l'option Multiviews est activ�e. Des variantes pr�sentant des qualit�s in�gales peuvent �tre indiqu�es au moyen du param�tre de type de m�dia : "qs", comme dans le cas de cette image (disponible en JPEG, GIF ou ASCII-art) :

URI: foo

URI: foo.jpeg
Content-type: image/jpeg; qs=0.8

URI: foo.gif
Content-type: image/gif; qs=0.5

URI: foo.txt
Content-type: text/plain; qs=0.01

Les valeurs de qs acceptables sont comprises entre 0.000 et 1.000. Notez qu'une variante avec un qs de 0.000 ne sera jamais choisie. La valeur de qs par d�faut est de 1.0. Le param�tre qs sert � indiquer la qualit� de la variante, par rapport aux autres variantes disponibles, et ce ind�pendamment des possibilit�s du navigateur. Par exemple, un fichier JPEG est g�n�ralement de meilleure qualit� qu'un fichier ASCII, si les 2 documents sont destin�s � repr�senter une photographie. Bien s�r, si la ressource originale est elle-m�me un fichier ASCII, la repr�sentation ASCII sera consid�r� comme de meilleure qualit� que la repr�sentation JPEG. La valeur de qs d�pend donc de la nature de la ressource que l'on souhaite repr�senter.

La liste compl�te des en-t�tes utilisables est disponible dans la documentation de mod_negotation.

Multiviews

L'option MultiViews est � sp�cifier par r�pertoire, ce qui signifie qu'elle peut �tre utilis�e au moyen d'une directive Options dans une section <Directory>, <Location> ou <Files> du fichier httpd.conf, ou dans les fichiers .htaccess (� condition que l'option AllowOverride soit param�tr�e pour cela). Notez que Options All n'active pas l'option MultiViews ; cette derni�re doit �tre positionn�e explicitement.

Voici comment fonctionne MultiViews : supposons qu'un serveur re�oive une requ�te pour /some/dir/foo, que l'option MultiViews soit activ�e pour /some/dir, et que le fichier /some/dir/foo n'existe pas ; alors le serveur cherche les fichiers nomm�s foo.* dans le r�pertoire /some/dir, et construit une table de types � partir de ces noms de fichiers. Dans la table, chaque fichier se voit assigner les types de m�dias et les encodages de contenu tels qu'ils seraient envoy�s si le client les demandait par leur nom propre. Apache choisit alors la meilleure repr�sentation � envoyer au client, en fonction de ses pr�f�rences.

L'option MultiViews sert aussi lors du choix d'un index, lorsque la directive DirectoryIndex est pr�cis�e. Par exemple, si la configuration contient

DirectoryIndex index

le serveur devra choisir entre les fichiers index.html et index.html3, dans le cas o� ces deux fichiers existent. Si aucun de ces fichiers n'existe, mais qu'un fichier index.cgi est pr�sent, ce dernier sera ex�cut� par le serveur.

Si � la lecture du r�pertoire, un fichier est trouv� dont l'extension n'est pas reconnue par mod_mime comme pr�cisant son jeu de caract�res, sa langue, son type de contenu (Content-Type) ou son encodage, alors tout d�pendra de la directive MultiViewsMatch. Cette directive pr�cise en effet quels gestionnaires, filtres, et autres types d'extensions peuvent contribuer � la n�gociation MultiViews.

top

M�thodes de N�gociations

Apr�s qu'Apache ait d�fini la liste de variantes possibles pour une ressource, que ce soit via un fichier de tables de types ou � partir des noms de fichiers contenus dans le r�pertoire, deux m�thodes peuvent �tre invoqu�es pour choisir la 'meilleure' variante qui sera envoy�e, pour autant qu'il en existe au moins une. Il n'est pas n�cessaire de conna�tre ce fonctionnement pour utiliser les n�gociations de contenu avec Apache ; cependant pour le lecteur int�ress� la suite de ce document s'attache � d�crire ce fonctionnement.

Il existe deux m�thodes de n�gociations :

  1. La n�gociation men�e par le serveur, selon l'algorithme d'Apache, est utilis�e dans la plupart des cas. L'algorithme d'Apache est d�taill� dans la suite de ce document. Dans les cas o� cet algorithme est utilis�, il arrive qu'Apache 'triche' sur le facteur qualit� (qs) d'une dimension donn�e pour parvenir � un meilleur r�sultat. Les cas o� cela se produit sont pr�sent�s dans la suite de ce document.
  2. La n�gociation transparente de contenu est utilis�e sur demande sp�cifique du navigateur, selon la m�thode d�finie dans la RFC 2295. Cette m�thode de n�gociation donne au navigateur les pleins pouvoirs pour choisir la 'meilleure' variante, les r�sultats d�pendent donc des algorithmes de choix propres � chaque navigateur. Cette m�thode permet �galement au navigateur de demander � Apache d'utiliser l'algorithme de 's�lection de variante � distance', tel que d�fini par la RFC 2296.

Dimensions d'une N�gociation

Dimension Notes
Type de M�dia Le navigateur pr�sente ses pr�f�rences au moyen du champ Accept de l'en-t�te. � chaque �l�ment peut �tre associ� un facteur de qualit�. De la m�me mani�re, la description de la variante peut pr�senter un facteur de qualit� (le param�tre "qs").
Langues Le navigateur pr�sente ses pr�f�rences au moyen du champ Accept-Language de l'en-t�te. � chaque �l�ment peut �tre associ� un facteur de qualit�. Les diff�rentes variantes peuvent �galement �tre associ�es ou non � une ou plusieurs langues.
Encodage Le navigateur pr�sente ses pr�f�rences au moyen du champ Accept-Encoding de l'en-t�te. � chaque �l�ment peut �tre associ� un facteur de qualit�.
Jeu de caract�res Le navigateur pr�sente ses pr�f�rences au moyen du champ Accept-Charset de l'en-t�te. � chaque �l�ment peut �tre associ� un facteur de qualit�. Les diff�rentes variantes peuvent se voir associer un jeu de caract�res comme type de m�dia.

Algorithme de N�gociation d'Apache

Apache peut utiliser l'algorithme pr�sent� ci-apr�s pour choisir la 'meilleure' variante, si elle existe, � renvoyer au navigateur. Cet algorithme n'est pas configurable. Il fonctionne de cette mani�re :

  1. En premier lieu, pour chaque dimension de la n�gociation, v�rifier le champ d'en-t�te Accept* appropri� et attribuer un facteur de qualit� � chacune des variantes. Si l'en-t�te Accept* d'une dimension indique que cette variante n'est pas acceptable, �liminer cette variante. S'il ne reste aucune variante, aller � l'�tape 4.
  2. Choisir la 'meilleure' des variantes par �limination. Chacun des tests suivants est appliqu� dans cet ordre. Toutes les variantes ne passant pas un test sont syst�matiquement �limin�es. Apr�s chacun des tests, s'il ne reste qu'une variante, la choisir comme la meilleure et aller � l'�tape 3. S'il reste plus d'une variante, aller � l'�tape suivante.
    1. Multiplier le facteur de qualit� de l'en-t�te Accept par le facteur qualit� de la source du type de m�dia de cette variante, et choisir les variantes avec le plus grand r�sultat.
    2. Choisir les variantes qui pr�sentent le plus grand facteur de qualit� de langue.
    3. Choisir les variantes dont la langue correspond le mieux, soit � l'ordre de pr�f�rence des langues dans l'en-t�te Accept-Language (s'il existe), soit � l'ordre des langues de la directive LanguagePriority (si elle existe).
    4. Choisir les variantes pr�sentant le param�tre de niveau ('level') de m�dia le plus grand (c'est ce qui est utilis� pour conna�tre la version des types de m�dias text/html).
    5. Choisir les variantes dont le jeu de caract�res est le meilleur, par rapport � l'en-t�te Accept-Charset. Le jeu de caract�res ISO-8859-1 est toujours acceptable, � moins qu'il n'ait �t� explicitement refus�. Les variantes avec un type de m�dia test/* et qui ne sont pas explicitement associ�es � un jeu de caract�re donn� sont suppos�es encod�es en ISO-8859-1.
    6. Choisir les variantes qui ont un jeu de caract�res d�fini et qui n'est pas ISO-8859-1. S'il n'existe pas de telles variantes, alors les choisir toutes.
    7. Choisir les variantes pr�sentant le meilleur encodage. S'il existe des variantes avec un encodage acceptable par le 'user-agent' du navigateur, choisir ces variantes seules. Dans le cas contraire, s'il existe � la fois des variantes encod�es et non encod�es, ne choisir que les variantes non encod�es. Dans les autres cas, choisir toutes les variantes.
    8. Choisir les variantes pr�sentant la plus petite taille.
    9. Choisir la premi�re variante de celles qui restent. Ce sera donc soit la premi�re variante list�e dans le fichier des tables de types, soit, si les variantes sont lues d'un r�pertoire, celle dont le nom appara�t en premier dans un classement par code ASCII.
  3. Cet algorithme a permis de choisir la 'meilleure' des variantes, qui est renvoy�e en r�ponse � la requ�te du navigateur. L'en-t�te Vary de la r�ponse HTTP est utilis� pour indiquer les dimensions de la n�gociation (les navigateurs et les serveurs mandataires sont capables de prendre en compte cette information quand il gardent une ressource en cache). Fin des op�rations.
  4. Arriver � ce point signifie qu'aucune variante n'a pu �tre choisie, car aucune n'est acceptable aux yeux du navigateur. Renvoyer une erreur 406 ("No acceptable representation" - NdT : "Aucune repr�sentation acceptable") dans un document HTML pr�sentant les diverses variantes possibles. L'en-t�te HTTP Vary est �galement renseign� pour pr�senter les dimensions de la n�gociation.
top

Tricher sur les Facteurs de Qualit�

Il arrive qu'Apache modifie les facteurs de qualit� par rapport � la valeur qu'ils devraient avoir en suivant strictement l'algorithme d�crit plus haut. Ceci permet d'obtenir de meilleurs r�sultats pour g�rer les navigateurs qui n'envoient pas toutes les informations ou envoient des informations erron�es. Ainsi, certains navigateurs, parmi les plus r�pandus du march�, envoient des en-t�tes Accept qui entra�neraient l'envoi de la mauvaise variante dans de nombreux cas. Si le navigateur envoie des informations correctes, Apache ne trichera pas sur les facteurs de qualit�.

Types de M�dias et Jokers

L'en-t�te de requ�te Accept: indique les pr�f�rences des types de m�dias. Elle peut comporter des 'jokers' tels que "image/*" ou "*/*", o� * signifie "n'importe quoi". Ainsi, une requ�te pr�sentant :

Accept: image/*, */*

signifierait que tout type commen�ant par "image/" est acceptable, comme serait acceptable tout autre type. Certains navigateurs envoient sans arr�t des jokers en plus des types qu'ils peuvent effectivement g�rer. Par exemple :

Accept: text/html, text/plain, image/gif, image/jpeg, */*

Le but de ces informations est d'indiquer que les types explicitement cit�s sont les pr�f�r�s mais que le navigateur accepte �galement d'autres repr�sentations. En utilisant les facteurs de qualit�, voici ce que devrait envoyer le navigateur :

Accept: text/html, text/plain, image/gif, image/jpeg, */*; q=0.01

Les types explicitement cit�s ne pr�sentent pas de facteur de qualit�, ils re�oivent donc la valeur par d�faut de 1.0 (la plus haute valeur possible). Les jokers sont affect�s d'une pr�f�rence tr�s basse de 0.01, si bien que les autres types ne seront utilis�s que si aucune des variantes ne correspond � un des types explicitement pr�f�r�s.

Si le champ d'en-t�te Accept: ne contient aucun facteur de qualit�, Apache modifie le facteur de qualit� de "*/*" (s'il est pr�sent) en 0.01 afin d'�muler le comportement souhait�. Apache positionne �galement le facteur de qualit� des jokers qui se pr�sentent sous la forme "type/*" en 0.02 (afin que ces derniers soient pr�f�r�s � "*/*"). Si un seul ou plusieurs types de m�dia de l'en-t�te Accept: pr�sente un facteur de qualit�, ces modifications ne sont pas effectu�es, afin que les requ�tes des navigateurs qui envoient des informations correctes fonctionnent comme pr�vu.

Exceptions aux N�gociations sur la Langue

� partir d'Apache 2.0, certaines exceptions ont �t� ajout�es � l'algorithme de n�gociation afin de retomber �l�gamment sur nos pattes dans les cas o� la n�gociation sur la langue n'aboutit pas.

Si un client demande une page du serveur, sans que ce dernier ne puisse d�terminer une page correspondant au champ Accept-language envoy� par le navigateur, le serveur doit renvoyer une r�ponse parmi "Pas de Variante Acceptable" et "Choix Multiples" au client. Afin d'�viter ces messages d'erreur, il est possible de configurer Apache pour qu'il ignore le champ Accept-language dans ces cas et qu'il fournisse au client un document qui ne correspond pas explicitement � sa requ�te. La directive ForceLanguagePriority peut �tre utilis�e pour passer outre � ces deux messages d'erreur et modifier la r�ponse du serveur au moyen de la directive LanguagePriority.

Le serveur va �galement essayer de modifier la sous-classe de langue si aucune correspondance n'est trouv�e. Par exemple, dans le cas o� un client demande des documents avec le langage en-GB pour "British English", le protocole HTTP/1.1 n'autorise pas le serveur � r�pondre par un document qui serait marqu� par en. (Notez que pr�senter en-GB dans l'en-t�te Accept-language est loin d'�tre pertinent, il semble tr�s peu probable que le lecteur comprenne l'anglais "British" et ne comprenne pas l'anglais "tout court". Il se trouve malheureusement que beaucoup de navigateurs pr�sentent ce comportement.) Bref, si aucune autre langue ne correspond et que le serveur s'appr�terait normalement � envoyer une r�ponse d'erreur "No Acceptable Variants", ou � utiliser la m�thode LanguagePriority pr�sent�e ci-avant, le serveur va ignorer la sous-classe de langue GB et consid�rer que la requ�te en-GB correspond bien au document en. Implicitement, Apache ajoute la langue parente (en) � la liste des langues consid�r�es comme acceptables par le navigateur, avec un facteur de qualit� tr�s faible. Notez cependant que si le client demande "en-GB; qs=0.9, fr; qs=0.8", et que le serveur dispose de documents marqu�s comme "en" et "fr", alors le document en fran�ais sera renvoy� par le serveur. Ce comportement est n�cessaire, afin de garder la compatibilit� avec HTTP/1.1 et fonctionner avec les navigateurs correctement configur�s.

Pour supporter les techniques avanc�es de d�tection de pr�f�rence de langues de l'utilisateur (telles que les Cookies, ou les chemins d'URL sp�ciaux), Apache reconna�t depuis la version 2.0.47 la variable d'environnement prefer-language. Si cette variable existe, et qu'elle pr�cise une langue valide, mod_negociation cherchera une variante qui y corresponde. S'il n'en trouve pas, le processus de n�gociation normal se d�roulera.

Exemple

SetEnvIf Cookie "language=en" prefer-language=en
SetEnvIf Cookie "language=fr" prefer-language=fr

top

Extensions vers la N�gociation de Contenu Transparente

Apache compl�te le protocole de n�gociation de contenu (RFC 2295) comme d�crit ici. Un nouvel �l�ment {encoding ..} est utilis� dans la liste des variantes pour nommer celles qui ne sont disponibles que sous un encodage sp�cifique. L'impl�mentation de l'algorithme RVSA/1.0 (RFC 2296) est �tendue afin d'int�grer les variantes encod�es dans la liste, et de les proposer comme candidates quand leur encodage est acceptable au vu de l'en-t�te Accept-Encoding. L'impl�mentation RVSA/1.0 ne tronque pas les facteurs de qualit� � 5 d�cimales avant de choisir la meilleure des variantes.

top

� propos des liens hypertextes et des conventions de nommage

Dans le cas o� la n�gociation de langues est utilis�e, il est possible de choisir diverses conventions de nommage, car les fichiers peuvent pr�senter plus d'une extension, et l'ordre des extensions n'est normalement pas significatif (voir la documentation mod_mime pour plus de d�tails).

Habituellement, un fichier a une extension pour son type MIME (par exemple, html), parfois une extension pour son encodage (par exemple, gz), et bien s�r une extension de langue (par exemple, en) pour distinguer les diverses variantes.

Exemples :

Voici d'autres exemples de noms de fichiers ainsi que des liens hypertextes valides et invalides :

Nom de Fichier Lien valide Lien invalide
foo.html.en foo
foo.html
-
foo.en.html foo foo.html
foo.html.en.gz foo
foo.html
foo.gz
foo.html.gz
foo.en.html.gz foo foo.html
foo.html.gz
foo.gz
foo.gz.html.en foo
foo.gz
foo.gz.html
foo.html
foo.html.gz.en foo
foo.html
foo.html.gz
foo.gz

Le tableau ci-dessus montre qu'il est toujours possible de sp�cifier le lien sans aucune extension dans un lien hypertexte. (par exemple, foo). L'avantage en est qu'il est ainsi possible de ne pas montrer le type d'un document, et de le modifier ult�rieurement, par exemple le passer de htmlshtml ou cgi sans avoir besoin de modifier aucun lien.

Pour continuer � utiliser les types MIME dans les liens (par exemple, foo.html), l'extension correspondant � la langue (ainsi que l'extension d'encodage, si elle existe) doit �tre du cot� droit de l'extension du type MIME (par exemple, foo.html.en).

top

� propos des Caches

Quand un cache garde en m�moire une repr�sentation, il l'associe � l'URL de la requ�te. Quand la m�me URL vient � �tre redemand�e, le cache peut utiliser la repr�sentation gard�e en m�moire, plut�t que de refaire une requ�te au serveur. Cependant, si la ressource est n�gociable cot� serveur, le r�sultat pourrait en �tre que la r�ponse � la premi�re requ�te mise en cache serait renvoy�e de fa�on erron�e. Pour pr�venir ce probl�me, Apache marque toutes les r�ponses issues d'une n�gociation comme "non-cachables" par les clients HTTP/1.0. Apache supporte les sp�cifications du protocole HTTP/1.1 en ce qui concerne la mise en cache des r�ponses n�goci�es.

Les requ�tes venant d'un client conforme au protocole HTTP/1.0 (qu'il s'agisse d'un navigateur ou d'un serveur cache) peuvent �tre rendues "cachables" si la directive CacheNegotiatedDocs est utilis�e. Cette directive peut �tre sp�cifi�e aussi bien dans la configuration principale du serveur que dans un serveur virtuel, et ne n�cessite pas d'argument. Elle n'a aucun impact sur les requ�tes des clients fonctionnant en HTTP/1.1.

top

Plus d'Information

Pour plus d'informations au sujet de la n�gociation de contenu, voir Language Negotiation Notes de Alan J. Flavell. Notez que ce document ne sera peut-�tre pas mis � jour en fonction des changements intervenus dans Apache 2.0.

Langues Disponibles:  en  |  fr  |  ja  |  ko