blob: 4b8755c3ad0da9f724cf85798410056d3dca64e9 [file] [log] [blame]
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr"><head>
<meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type" />
<meta content="noindex, nofollow" name="robots" />
<!--
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
This file is generated from xml source: DO NOT EDIT
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-->
<title>N&#233;gociation de Contenus - Serveur Apache HTTP</title>
<link href="./style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
<link href="./style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
<link href="./style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" />
<link href="./images/favicon.ico" rel="shortcut icon" /><link href="http://httpd.apache.org/docs/current/content-negotiation.html" rel="canonical" /></head>
<body id="manual-page"><div id="page-header">
<p class="menu"><a href="./mod/">Modules</a> | <a href="./mod/directives.html">Directives</a> | <a href="./faq/">FAQ</a> | <a href="./glossary.html">Glossaire</a> | <a href="./sitemap.html">Plan du site</a></p>
<p class="apache">Serveur Apache HTTP Version 2.0</p>
<img alt="" src="./images/feather.gif" /></div>
<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="./images/left.gif" /></a></div>
<div id="path">
<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">Serveur HTTP</a> &gt; <a href="http://httpd.apache.org/docs/">Documentation</a> &gt; <a href="./">Version 2.0</a></div><div id="page-content"><div class="retired"><h4>Please note</h4>
<p>This document refers to the <strong>2.0</strong> version of Apache httpd, which <strong>is no longer maintained</strong>. Upgrade, and refer to the current version of httpd instead, documented at:</p>
<ul><li><a href="http://httpd.apache.org/docs/current/">Current release version of Apache HTTP Server documentation</a></li></ul><p>You may follow <a href="http://httpd.apache.org/docs/current/content-negotiation.html">this link</a> to go to the current version of this document.</p></div><div id="preamble"><h1>N&#233;gociation de Contenus</h1>
<div class="toplang">
<p><span>Langues Disponibles: </span><a href="./en/content-negotiation.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
<a href="./fr/content-negotiation.html" title="Fran&#231;ais">&nbsp;fr&nbsp;</a> |
<a href="./ja/content-negotiation.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
<a href="./ko/content-negotiation.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
<a href="./tr/content-negotiation.html" hreflang="tr" rel="alternate" title="T&#252;rk&#231;e">&nbsp;tr&nbsp;</a></p>
</div>
<div class="outofdate">Cette traduction peut &#234;tre p&#233;rim&#233;e. Consultez la version
Anglaise pour les changements r&#233;cents.</div>
<p>Apache suit les sp&#233;cifications HTTP/1.1 en ce qui concerne
les n&#233;gociations de contenus. Il est ainsi possible d'utiliser
les informations fournies par le navigateur (pr&#233;f&#233;rences de langues,
jeu de caract&#232;res, encodage et types de m&#233;dias). Apache essaye
aussi d'optimiser les cas des navigateurs envoyant des
informations incompl&#232;tes.</p>
<p>C'est le module <code class="module"><a href="./mod/mod_negotiation.html">mod_negotiation</a></code> qui fournit
la n&#233;gociation de contenus&nbsp;; ce module est inclus dans Apache
par d&#233;faut.</p>
</div>
<div id="quickview"><ul id="toc"><li><img alt="" src="./images/down.gif" /> <a href="#about">&#192; propos de la N&#233;gociation de Contenus</a></li>
<li><img alt="" src="./images/down.gif" /> <a href="#negotiation">N&#233;gociations avec Apache</a></li>
<li><img alt="" src="./images/down.gif" /> <a href="#methods">M&#233;thodes de N&#233;gociations</a></li>
<li><img alt="" src="./images/down.gif" /> <a href="#better">Tricher sur les Facteurs de Qualit&#233;</a></li>
<li><img alt="" src="./images/down.gif" /> <a href="#extensions">Extensions vers la N&#233;gociation de Contenu
Transparente</a></li>
<li><img alt="" src="./images/down.gif" /> <a href="#naming">&#192; propos des liens hypertextes et des conventions de nommage</a></li>
<li><img alt="" src="./images/down.gif" /> <a href="#caching">&#192; propos des Caches</a></li>
<li><img alt="" src="./images/down.gif" /> <a href="#more">Plus d'Information</a></li>
</ul></div>
<div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
<div class="section">
<h2><a name="about" id="about">&#192; propos de la N&#233;gociation de Contenus</a></h2>
<p>Diff&#233;rentes repr&#233;sentations peuvent &#234;tre utilis&#233;es pour
communiquer une ressource. Par exemple, plusieurs langues peuvent
&#234;tre disponibles, ou plusieurs types de m&#233;dias, voire parfois une
combinaison de ces possibilit&#233;s.
Une m&#233;thode pour g&#233;rer cela est de donner le choix au visiteur,
en lui proposant un index g&#233;n&#233;ral, qui lui permet par exemple de
choisir sa langue. Cependant, il est souvent possible de faire ce
choix de mani&#232;re automatique car les navigateurs peuvent pr&#233;ciser
avec leurs requ&#234;tes, la repr&#233;sentation qu'ils pr&#233;f&#232;rent recevoir. Par
exemple, un navigateur pourrait sp&#233;cifier qu'il pr&#233;f&#232;re recevoir les
informations en fran&#231;ais si elles sont disponibles, ou en anglais
dans le cas contraire. Ce type d'information est communiqu&#233; par les
navigateurs, dans les en-t&#234;tes de chaque requ&#234;te. Un navigateur ne
demandant que des documents en fran&#231;ais enverrait</p>
<div class="example"><p><code>Accept-Language: fr</code></p></div>
<p>Notez que cette pr&#233;f&#233;rence ne sera g&#233;r&#233;e par le serveur que
s'il existe un choix de langues du c&#244;t&#233; du serveur.</p>
<p>Voici un exemple plus complet, o&#249; le navigateur est configur&#233; pour
accepter le fran&#231;ais et l'anglais, mais avec une pr&#233;f&#233;rence pour le
fran&#231;ais, et pour accepter divers types de m&#233;dias, en pr&#233;f&#233;rant le
HTML au texte brut, et en pr&#233;f&#233;rant le GIF ou le JPEG aux autres types
de m&#233;dias (sans pour autant refuser ces derniers, le cas &#233;ch&#233;ant)&nbsp;:</p>
<div class="example"><p><code>
Accept-Language: fr; q=1.0, en; q=0.5<br />
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
</code></p></div>
<p>Apache supporte les n&#233;gociations de contenus 'g&#233;r&#233;s par
le serveur', telles que sp&#233;cifi&#233;es dans HTTP/1.1. Les en-t&#234;tes
<code>Accept</code>, <code>Accept-Language</code>,
<code>Accept-Charset</code> et <code>Accept-Encoding</code>
sont g&#233;r&#233;s. Apache supporte &#233;galement les n&#233;gociations de
contenus 'transparentes', telles que d&#233;finies dans les RFC
2295 et 2296. En revanche les fonctions de 'feature
negotiation' d&#233;finies dans ces RFCs ne sont pas support&#233;es.</p>
<p>On appelle <strong>ressource</strong> une entit&#233; conceptuelle
identifi&#233;e par un URI (RFC 2396). Le travail d'un serveur HTTP,
tel Apache, est de donner un acc&#232;s &#224; des
<strong>repr&#233;sentations</strong> des ressources &#224; sa disposition,
chaque repr&#233;sentation &#233;tant envoy&#233;e sous la forme d'une s&#233;quence
d'octets d&#233;finie selon un type de m&#233;dia, un jeu de caract&#232;res,
un encodage, etc. &#192; tout moment, chaque ressource est associ&#233;e
&#224; z&#233;ro, une ou plusieurs repr&#233;sentations. Si plusieurs repr&#233;sentations
sont disponibles pour une ressource, on dit que cette derni&#232;re est
<strong>n&#233;gociable</strong> et chacune de ses repr&#233;sentations
possibles est appel&#233;e une <strong>variante</strong>.
Les diff&#233;rentes possibilit&#233;s de choisir les variantes d'une ressource
n&#233;gociable sont appel&#233;es <strong>dimensions</strong> de la
n&#233;gociation.</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
<div class="section">
<h2><a name="negotiation" id="negotiation">N&#233;gociations avec Apache</a></h2>
<p>Pour qu'Apache puisse proc&#233;der &#224; la n&#233;gociation d'une ressource,
il faut qu'il dispose d'informations &#224; propos de chacune des variantes.
Deux m&#233;thodes sont possibles&nbsp;:</p>
<ul>
<li>R&#233;aliser une "Table de Types" (<em>c'est-&#224;-dire</em>,
un fichier <code>*.var</code>) qui pr&#233;cise explicitement les fichiers
d&#233;finissant les variantes, ou</li>
<li>Utiliser une recherche 'MultiViews', m&#233;thode par laquelle
le serveur r&#233;alise une recherche par motifs implicites,
et choisit parmi les r&#233;sultats.</li>
</ul>
<h3><a name="type-map" id="type-map">Utilisation d'une Table de Types (Type Map)</a></h3>
<p>Une table de types est un document qui est associ&#233; avec le
gestionnaire <code>type-map</code> (ou, dans les plus anciennes
versions d'Apache, le type mime <code>application/x-type-map</code>).
Notez que pour impl&#233;menter cette m&#233;thode, un 'handler' doit &#234;tre
d&#233;fini dans la configuration pour associer une extension de fichier &#224;
<code>type-map</code>&nbsp;; ce qui est g&#233;n&#233;ralement obtenu au moyen de</p>
<div class="example"><p><code>AddHandler type-map .var</code></p></div>
<p>dans le fichier de configuration du serveur.</p>
<p>Les fichiers de table de types portent g&#233;n&#233;ralement le nom de la
ressource qu'ils d&#233;crivent, et contiennent une entr&#233;e correspondant
&#224; chaque variante possible&nbsp;; ces entr&#233;es sont constitu&#233;es de lignes
au format d'en-t&#234;tes HTTP. Les entr&#233;es de deux variantes distinctes
sont &#224; s&#233;parer par des lignes vides. Il n'est pas permis d'utiliser
des lignes vides au sein d'une entr&#233;e. Il est courant de placer en
d&#233;but de fichier une entr&#233;e pour l'entit&#233; combin&#233;e
dans son ensemble (bien que cela ne soit pas n&#233;cessaire, et ignor&#233;
par Apache). Un exemple de fichier de table est donn&#233; en exemple
ci-apr&#232;s. Le nom de ce fichier serait <code>foo.var</code>, puisque
le fichier d&#233;crit une ressource appel&#233;e <code>foo</code>.</p>
<div class="example"><p><code>
URI: foo<br />
<br />
URI: foo.en.html<br />
Content-type: text/html<br />
Content-language: en<br />
<br />
URI: foo.fr.de.html<br />
Content-type: text/html;charset=iso-8859-2<br />
Content-language: fr, de<br />
</code></p></div>
<p>Notez que les fichiers de table de types sont toujours
utilis&#233;s en priorit&#233; par Apache par rapport &#224; l'extension du
nom du fichier, et ce m&#234;me si l'option Multiviews est activ&#233;e.
Des variantes pr&#233;sentant des qualit&#233;s in&#233;gales peuvent &#234;tre indiqu&#233;es
au moyen du param&#232;tre de type de m&#233;dia&nbsp;: "qs", comme dans le cas de
cette image (disponible en JPEG, GIF ou ASCII-art)&nbsp;: </p>
<div class="example"><p><code>
URI: foo<br />
<br />
URI: foo.jpeg<br />
Content-type: image/jpeg; qs=0.8<br />
<br />
URI: foo.gif<br />
Content-type: image/gif; qs=0.5<br />
<br />
URI: foo.txt<br />
Content-type: text/plain; qs=0.01<br />
</code></p></div>
<p>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&#233;faut est de 1.0. Le
param&#232;tre qs sert &#224; indiquer la qualit&#233; de la variante, par
rapport aux autres variantes disponibles, et ce ind&#233;pendamment
des possibilit&#233;s du navigateur. Par exemple, un fichier JPEG
est g&#233;n&#233;ralement de meilleure qualit&#233; qu'un fichier ASCII, si
les 2 documents sont destin&#233;s &#224; repr&#233;senter une photographie.
Bien s&#251;r, si la ressource originale est elle-m&#234;me un fichier
ASCII, la repr&#233;sentation ASCII sera consid&#233;r&#233; comme de meilleure
qualit&#233; que la repr&#233;sentation JPEG. La valeur de qs d&#233;pend donc
de la nature de la ressource que l'on souhaite repr&#233;senter.</p>
<p>La liste compl&#232;te des en-t&#234;tes utilisables est disponible
dans la documentation de
<a href="mod/mod_negotiation.html#typemaps">mod_negotation</a>.</p>
<h3><a name="multiviews" id="multiviews">Multiviews</a></h3>
<p>L'option <code>MultiViews</code> est &#224; sp&#233;cifier par r&#233;pertoire,
ce qui signifie qu'elle peut &#234;tre utilis&#233;e au moyen d'une directive
<code class="directive"><a href="./mod/core.html#options">Options</a></code> dans une section
<code class="directive"><a href="./mod/core.html#directory">&lt;Directory&gt;</a></code>,
<code class="directive"><a href="./mod/core.html#location">&lt;Location&gt;</a></code> ou
<code class="directive"><a href="./mod/core.html#files">&lt;Files&gt;</a></code>
du fichier <code>httpd.conf</code>, ou dans les fichiers
<code>.htaccess</code> (&#224; condition que l'option <code class="directive"><a href="./mod/core.html#allowoverride">AllowOverride</a></code> soit param&#233;tr&#233;e pour cela).
Notez que <code>Options All</code> n'active pas l'option
<code>MultiViews</code>&nbsp;; cette derni&#232;re doit &#234;tre positionn&#233;e
explicitement.</p>
<p>Voici comment fonctionne <code>MultiViews</code>&nbsp;: supposons qu'un
serveur re&#231;oive une requ&#234;te pour <code>/some/dir/foo</code>, que l'option
<code>MultiViews</code> soit activ&#233;e pour <code>/some/dir</code>,
et que le fichier <code>/some/dir/foo</code> <em>n'</em>existe
<em>pas</em>&nbsp;; alors le serveur cherche les fichiers nomm&#233;s foo.*
dans le r&#233;pertoire /some/dir, et construit une table de types &#224;
partir de ces noms de fichiers. Dans la table, chaque fichier se
voit assigner les types de m&#233;dias et les encodages de contenu
tels qu'ils seraient envoy&#233;s si le client les demandait par leur
nom propre. Apache choisit alors la meilleure repr&#233;sentation &#224;
envoyer au client, en fonction de ses pr&#233;f&#233;rences.</p>
<p>L'option <code>MultiViews</code> sert aussi lors du choix d'un
index, lorsque la directive <code class="directive"><a href="./mod/mod_dir.html#directoryindex">DirectoryIndex</a></code> est pr&#233;cis&#233;e.
Par exemple, si la configuration contient</p>
<div class="example"><p><code>DirectoryIndex index</code></p></div>
<p>le serveur devra choisir entre les fichiers <code>index.html</code> et
<code>index.html3</code>, dans le cas o&#249; ces deux fichiers existent. Si
aucun de ces fichiers n'existe, mais qu'un fichier <code>index.cgi</code>
est pr&#233;sent, ce dernier sera ex&#233;cut&#233; par le serveur.</p>
<p>Si &#224; la lecture du r&#233;pertoire, un fichier est trouv&#233;
dont l'extension n'est pas reconnue par <code>mod_mime</code>
comme pr&#233;cisant son jeu de caract&#232;res, sa langue, son type de
contenu (Content-Type) ou son encodage, alors tout d&#233;pendra de la
directive <code class="directive"><a href="./mod/mod_mime.html#multiviewsmatch">MultiViewsMatch</a></code>.
Cette directive pr&#233;cise en effet quels gestionnaires, filtres, et
autres types d'extensions peuvent contribuer &#224; la n&#233;gociation
MultiViews.</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
<div class="section">
<h2><a name="methods" id="methods">M&#233;thodes de N&#233;gociations</a></h2>
<p>Apr&#232;s qu'Apache ait d&#233;fini la liste de variantes possibles
pour une ressource, que ce soit via un fichier de tables de
types ou &#224; partir des noms de fichiers contenus dans le r&#233;pertoire,
deux m&#233;thodes peuvent &#234;tre invoqu&#233;es pour choisir la 'meilleure'
variante qui sera envoy&#233;e, pour autant qu'il en existe au moins
une. Il n'est pas n&#233;cessaire de conna&#238;tre ce fonctionnement pour
utiliser les n&#233;gociations de contenu avec Apache&nbsp;; cependant pour
le lecteur int&#233;ress&#233; la suite de ce document s'attache &#224; d&#233;crire
ce fonctionnement.</p>
<p>Il existe deux m&#233;thodes de n&#233;gociations&nbsp;:</p>
<ol>
<li><strong>La n&#233;gociation men&#233;e par le serveur, selon
l'algorithme d'Apache</strong>, est utilis&#233;e dans la plupart
des cas. L'algorithme d'Apache est d&#233;taill&#233; dans la suite de
ce document. Dans les cas o&#249; cet algorithme est utilis&#233;, il
arrive qu'Apache 'triche' sur le facteur qualit&#233; (qs) d'une
dimension donn&#233;e pour parvenir &#224; un meilleur r&#233;sultat. Les cas
o&#249; cela se produit sont pr&#233;sent&#233;s dans la suite de ce document.</li>
<li><strong>La n&#233;gociation transparente de contenu</strong>
est utilis&#233;e sur demande sp&#233;cifique du navigateur, selon la
m&#233;thode d&#233;finie dans la RFC 2295. Cette m&#233;thode de n&#233;gociation
donne au navigateur les pleins pouvoirs pour choisir la
'meilleure' variante, les r&#233;sultats d&#233;pendent donc des algorithmes
de choix propres &#224; chaque navigateur. Cette m&#233;thode permet
&#233;galement au navigateur de demander &#224; Apache d'utiliser
l'algorithme de 's&#233;lection de variante &#224; distance', tel que d&#233;fini
par la RFC 2296.</li>
</ol>
<h3><a name="dimensions" id="dimensions">Dimensions d'une N&#233;gociation</a></h3>
<table>
<tr valign="top">
<th>Dimension</th>
<th>Notes</th>
</tr>
<tr valign="top">
<td>Type de M&#233;dia</td>
<td>Le navigateur pr&#233;sente ses pr&#233;f&#233;rences au moyen du
champ <code>Accept</code> de l'en-t&#234;te. &#192; chaque &#233;l&#233;ment peut &#234;tre
associ&#233; un facteur de qualit&#233;. De la m&#234;me mani&#232;re, la description
de la variante peut pr&#233;senter un facteur de qualit&#233; (le
param&#232;tre "qs").</td>
</tr>
<tr valign="top">
<td>Langues</td>
<td>Le navigateur pr&#233;sente ses pr&#233;f&#233;rences au moyen du champ
<code>Accept-Language</code> de l'en-t&#234;te. &#192; chaque &#233;l&#233;ment
peut &#234;tre associ&#233; un facteur de qualit&#233;. Les diff&#233;rentes
variantes peuvent &#233;galement &#234;tre associ&#233;es ou non &#224; une
ou plusieurs langues.</td>
</tr>
<tr valign="top">
<td>Encodage</td>
<td>Le navigateur pr&#233;sente ses pr&#233;f&#233;rences au moyen du champ
<code>Accept-Encoding</code> de l'en-t&#234;te. &#192; chaque &#233;l&#233;ment
peut &#234;tre associ&#233; un facteur de qualit&#233;.</td>
</tr>
<tr valign="top">
<td>Jeu de caract&#232;res</td>
<td>Le navigateur pr&#233;sente ses pr&#233;f&#233;rences au moyen du champ
<code>Accept-Charset</code> de l'en-t&#234;te. &#192; chaque &#233;l&#233;ment
peut &#234;tre associ&#233; un facteur de qualit&#233;. Les diff&#233;rentes
variantes peuvent se voir associer un jeu de caract&#232;res
comme type de m&#233;dia.</td>
</tr>
</table>
<h3><a name="algorithm" id="algorithm">Algorithme de N&#233;gociation d'Apache</a></h3>
<p>Apache peut utiliser l'algorithme pr&#233;sent&#233; ci-apr&#232;s pour choisir la
'meilleure' variante, si elle existe, &#224; renvoyer au navigateur. Cet
algorithme n'est pas configurable. Il fonctionne de cette mani&#232;re&nbsp;:</p>
<ol>
<li>En premier lieu, pour chaque dimension de la n&#233;gociation,
v&#233;rifier le champ d'en-t&#234;te <em>Accept*</em> appropri&#233; et
attribuer un facteur de qualit&#233; &#224; chacune des variantes. Si
l'en-t&#234;te <em>Accept*</em> d'une dimension indique que cette
variante n'est pas acceptable, &#233;liminer cette variante. S'il
ne reste aucune variante, aller &#224; l'&#233;tape 4.</li>
<li>
Choisir la 'meilleure' des variantes par &#233;limination.
Chacun des tests suivants est appliqu&#233; dans cet ordre.
Toutes les variantes ne passant pas un test sont
syst&#233;matiquement &#233;limin&#233;es. Apr&#232;s chacun des tests, s'il
ne reste qu'une variante, la choisir comme la meilleure
et aller &#224; l'&#233;tape 3. S'il reste plus d'une variante, aller
&#224; l'&#233;tape suivante.
<ol>
<li>Multiplier le facteur de qualit&#233; de l'en-t&#234;te
<code>Accept</code> par le facteur qualit&#233; de la source du
type de m&#233;dia de cette variante, et choisir les variantes
avec le plus grand r&#233;sultat.</li>
<li>Choisir les variantes qui pr&#233;sentent le plus grand
facteur de qualit&#233; de langue.</li>
<li>Choisir les variantes dont la langue correspond le
mieux, soit &#224; l'ordre de pr&#233;f&#233;rence des langues dans
l'en-t&#234;te <code>Accept-Language</code> (s'il existe),
soit &#224; l'ordre des langues de la directive
<code>LanguagePriority</code> (si elle existe).</li>
<li>Choisir les variantes pr&#233;sentant le param&#232;tre de niveau
('level') de m&#233;dia le plus grand (c'est ce qui est utilis&#233;
pour conna&#238;tre la version des types de m&#233;dias text/html).</li>
<li>Choisir les variantes dont le jeu de caract&#232;res est le
meilleur, par rapport &#224; l'en-t&#234;te <code>Accept-Charset</code>.
Le jeu de caract&#232;res ISO-8859-1 est toujours acceptable, &#224;
moins qu'il n'ait &#233;t&#233; explicitement refus&#233;. Les variantes
avec un type de m&#233;dia <code>test/*</code> et qui ne sont
pas explicitement associ&#233;es &#224; un jeu de caract&#232;re donn&#233;
sont suppos&#233;es encod&#233;es en ISO-8859-1.</li>
<li>Choisir les variantes qui ont un jeu de caract&#232;res
d&#233;fini et qui <em>n'</em>est <em>pas</em> ISO-8859-1.
S'il n'existe pas de telles variantes, alors les
choisir toutes.</li>
<li>Choisir les variantes pr&#233;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 &#224; la fois des variantes
encod&#233;es et non encod&#233;es, ne choisir que les variantes
non encod&#233;es. Dans les autres cas, choisir toutes les
variantes.</li>
<li>Choisir les variantes pr&#233;sentant la plus petite taille.</li>
<li>Choisir la premi&#232;re variante de celles qui restent. Ce
sera donc soit la premi&#232;re variante list&#233;e dans le fichier
des tables de types, soit, si les variantes sont lues d'un
r&#233;pertoire, celle dont le nom appara&#238;t en premier dans un
classement par code ASCII.</li>
</ol>
</li>
<li>Cet algorithme a permis de choisir la 'meilleure' des
variantes, qui est renvoy&#233;e en r&#233;ponse &#224; la requ&#234;te du
navigateur. L'en-t&#234;te <code>Vary</code> de la r&#233;ponse HTTP
est utilis&#233; pour indiquer les dimensions de la n&#233;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&#233;rations.</li>
<li>Arriver &#224; ce point signifie qu'aucune variante n'a pu &#234;tre
choisie, car aucune n'est acceptable aux yeux du navigateur.
Renvoyer une erreur 406 ("No acceptable representation" - NdT&nbsp;:
"Aucune repr&#233;sentation acceptable") dans un document HTML
pr&#233;sentant les diverses variantes possibles. L'en-t&#234;te HTTP
<code>Vary</code> est &#233;galement renseign&#233; pour pr&#233;senter les
dimensions de la n&#233;gociation.</li>
</ol>
</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
<div class="section">
<h2><a name="better" id="better">Tricher sur les Facteurs de Qualit&#233;</a></h2>
<p>Il arrive qu'Apache modifie les facteurs de qualit&#233; par rapport
&#224; la valeur qu'ils devraient avoir en suivant strictement
l'algorithme d&#233;crit plus haut. Ceci permet d'obtenir de meilleurs
r&#233;sultats pour g&#233;rer les navigateurs qui n'envoient pas toutes
les informations ou envoient des informations erron&#233;es. Ainsi,
certains navigateurs, parmi les plus r&#233;pandus du march&#233;, envoient
des en-t&#234;tes <code>Accept</code> qui entra&#238;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&#233;.</p>
<h3><a name="wildcards" id="wildcards">Types de M&#233;dias et Jokers</a></h3>
<p>L'en-t&#234;te de requ&#234;te <code>Accept:</code> indique les pr&#233;f&#233;rences
des types de m&#233;dias. Elle peut comporter des 'jokers' tels que
"image/*" ou "*/*", o&#249; * signifie "n'importe quoi". Ainsi, une
requ&#234;te pr&#233;sentant&nbsp;:</p>
<div class="example"><p><code>Accept: image/*, */*</code></p></div>
<p>signifierait que tout type commen&#231;ant par "image/" est
acceptable, comme serait acceptable tout autre type. Certains
navigateurs envoient sans arr&#234;t des jokers en plus des types
qu'ils peuvent effectivement g&#233;rer. Par exemple&nbsp;:</p>
<div class="example"><p><code>
Accept: text/html, text/plain, image/gif, image/jpeg, */*
</code></p></div>
<p>Le but de ces informations est d'indiquer que les types
explicitement cit&#233;s sont les pr&#233;f&#233;r&#233;s mais que le
navigateur accepte &#233;galement d'autres repr&#233;sentations.
En utilisant les facteurs de qualit&#233;, voici ce que devrait
envoyer le navigateur&nbsp;:</p>
<div class="example"><p><code>
Accept: text/html, text/plain, image/gif, image/jpeg, */*; q=0.01
</code></p></div>
<p>Les types explicitement cit&#233;s ne pr&#233;sentent pas de facteur
de qualit&#233;, ils re&#231;oivent donc la valeur par d&#233;faut de 1.0
(la plus haute valeur possible). Les jokers sont affect&#233;s
d'une pr&#233;f&#233;rence tr&#232;s basse de 0.01, si bien que les autres
types ne seront utilis&#233;s que si aucune des variantes ne
correspond &#224; un des types explicitement pr&#233;f&#233;r&#233;s.</p>
<p>Si le champ d'en-t&#234;te <code>Accept:</code> <em>ne</em>
contient <em>aucun</em> facteur de qualit&#233;, Apache modifie
le facteur de qualit&#233; de "*/*" (s'il est pr&#233;sent) en 0.01
afin d'&#233;muler le comportement souhait&#233;. Apache positionne
&#233;galement le facteur de qualit&#233; des jokers qui se pr&#233;sentent
sous la forme "type/*" en 0.02 (afin que ces derniers soient
pr&#233;f&#233;r&#233;s &#224; "*/*"). Si un seul ou plusieurs types de m&#233;dia de
l'en-t&#234;te <code>Accept:</code> pr&#233;sente un facteur de qualit&#233;,
ces modifications <em>ne</em> sont <em>pas</em> effectu&#233;es,
afin que les requ&#234;tes des navigateurs qui envoient des
informations correctes fonctionnent comme pr&#233;vu.</p>
<h3><a name="exceptions" id="exceptions">Exceptions aux N&#233;gociations sur la Langue</a></h3>
<p>&#192; partir d'Apache 2.0, certaines exceptions ont &#233;t&#233; ajout&#233;es
&#224; l'algorithme de n&#233;gociation afin de retomber &#233;l&#233;gamment sur
nos pattes dans les cas o&#249; la n&#233;gociation sur la langue
n'aboutit pas.</p>
<p>Si un client demande une page du serveur, sans que ce dernier
ne puisse d&#233;terminer une page correspondant au champ
<code>Accept-language</code> envoy&#233; par le navigateur, le serveur
doit renvoyer une r&#233;ponse parmi "Pas de Variante Acceptable"
et "Choix Multiples" au client. Afin d'&#233;viter ces messages
d'erreur, il est possible de configurer Apache pour qu'il ignore
le champ <code>Accept-language</code> dans ces cas et qu'il
fournisse au client un document qui ne correspond pas
explicitement &#224; sa requ&#234;te. La directive
<code class="directive"><a href="./mod/mod_negotiation.html#forcelanguagepriority">ForceLanguagePriority</a></code>
peut &#234;tre utilis&#233;e pour passer outre &#224; ces deux messages d'erreur
et modifier la r&#233;ponse du serveur au moyen de la directive
<code class="directive"><a href="./mod/mod_negotiation.html#languagepriority">LanguagePriority</a></code>.</p>
<p>Le serveur va &#233;galement essayer de modifier la sous-classe
de langue si aucune correspondance n'est trouv&#233;e. Par exemple,
dans le cas o&#249; un client demande des documents avec le langage
<code>en-GB</code> pour "British English", le protocole HTTP/1.1
n'autorise pas le serveur &#224; r&#233;pondre par un document qui serait
marqu&#233; par <code>en</code>. (Notez que pr&#233;senter
<code>en-GB</code> dans l'en-t&#234;te <code>Accept-language</code>
est loin d'&#234;tre pertinent, il semble tr&#232;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&#233;sentent ce comportement.) Bref,
si aucune autre langue ne correspond et que le serveur
s'appr&#234;terait normalement &#224; envoyer une r&#233;ponse d'erreur
"No Acceptable Variants", ou &#224; utiliser la m&#233;thode
<code class="directive"><a href="./mod/mod_negociation.html#languagepriority">LanguagePriority</a></code>
pr&#233;sent&#233;e ci-avant, le serveur va ignorer la sous-classe de
langue <code>GB</code> et consid&#233;rer que la requ&#234;te
<code>en-GB</code> correspond bien au document <code>en</code>.
Implicitement, Apache ajoute la langue parente (<code>en</code>)
&#224; la liste des langues consid&#233;r&#233;es comme acceptables par le
navigateur, avec un facteur de qualit&#233; tr&#232;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&#233;s comme "en" et
"fr", alors le document en fran&#231;ais sera renvoy&#233; par le serveur.
Ce comportement est n&#233;cessaire, afin de garder la compatibilit&#233;
avec HTTP/1.1 et fonctionner avec les navigateurs correctement
configur&#233;s.</p>
<p>Pour supporter les techniques avanc&#233;es de d&#233;tection de
pr&#233;f&#233;rence de langues de l'utilisateur (telles que les
Cookies, ou les chemins d'URL sp&#233;ciaux), Apache reconna&#238;t
depuis la version 2.0.47 la <a href="env.html">variable
d'environnement</a> <code>prefer-language</code>. Si cette
variable existe, et qu'elle pr&#233;cise une langue valide,
<code class="module"><a href="./mod/mod_negociation.html">mod_negociation</a></code> cherchera une variante qui
y corresponde. S'il n'en trouve pas, le processus de
n&#233;gociation normal se d&#233;roulera.</p>
<div class="example"><h3>Exemple</h3><p><code>
SetEnvIf Cookie "language=en" prefer-language=en<br />
SetEnvIf Cookie "language=fr" prefer-language=fr
</code></p></div>
</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
<div class="section">
<h2><a name="extensions" id="extensions">Extensions vers la N&#233;gociation de Contenu
Transparente</a></h2>
<p>Apache compl&#232;te le protocole de n&#233;gociation de contenu (RFC 2295)
comme d&#233;crit ici. Un nouvel &#233;l&#233;ment <code>{encoding ..}</code> est
utilis&#233; dans la liste des variantes pour nommer celles qui ne sont
disponibles que sous un encodage sp&#233;cifique. L'impl&#233;mentation de
l'algorithme RVSA/1.0 (RFC 2296) est &#233;tendue afin d'int&#233;grer les
variantes encod&#233;es dans la liste, et de les proposer comme
candidates quand leur encodage est acceptable au vu de l'en-t&#234;te
<code>Accept-Encoding</code>. L'impl&#233;mentation RVSA/1.0 ne tronque
pas les facteurs de qualit&#233; &#224; 5 d&#233;cimales avant de choisir la
meilleure des variantes.</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
<div class="section">
<h2><a name="naming" id="naming">&#192; propos des liens hypertextes et des conventions de nommage</a></h2>
<p>Dans le cas o&#249; la n&#233;gociation de langues est utilis&#233;e, il est
possible de choisir diverses conventions de nommage, car les
fichiers peuvent pr&#233;senter plus d'une extension, et l'ordre des
extensions n'est normalement pas significatif (voir la
documentation <a href="mod/mod_mime.html#multipleext">mod_mime</a>
pour plus de d&#233;tails).</p>
<p>Habituellement, un fichier a une extension pour son type MIME
(par exemple, <code>html</code>), parfois une extension pour son
encodage (par exemple, <code>gz</code>), et bien s&#251;r une extension
de langue (par exemple, <code>en</code>) pour distinguer les
diverses variantes.</p>
<p>Exemples&nbsp;:</p>
<ul>
<li>foo.en.html</li>
<li>foo.html.en</li>
<li>foo.en.html.gz</li>
</ul>
<p>Voici d'autres exemples de noms de fichiers ainsi que des liens
hypertextes valides et invalides&nbsp;:</p>
<table class="bordered">
<tr>
<th>Nom de Fichier</th>
<th>Lien valide</th>
<th>Lien invalide</th>
</tr>
<tr>
<td><em>foo.html.en</em></td>
<td>foo<br />
foo.html</td>
<td>-</td>
</tr>
<tr>
<td><em>foo.en.html</em></td>
<td>foo</td>
<td>foo.html</td>
</tr>
<tr>
<td><em>foo.html.en.gz</em></td>
<td>foo<br />
foo.html</td>
<td>foo.gz<br />
foo.html.gz</td>
</tr>
<tr>
<td><em>foo.en.html.gz</em></td>
<td>foo</td>
<td>foo.html<br />
foo.html.gz<br />
foo.gz</td>
</tr>
<tr>
<td><em>foo.gz.html.en</em></td>
<td>foo<br />
foo.gz<br />
foo.gz.html</td>
<td>foo.html</td>
</tr>
<tr>
<td><em>foo.html.gz.en</em></td>
<td>foo<br />
foo.html<br />
foo.html.gz</td>
<td>foo.gz</td>
</tr>
</table>
<p>Le tableau ci-dessus montre qu'il est toujours possible de
sp&#233;cifier le lien sans aucune extension dans un lien hypertexte.
(par exemple, <code>foo</code>). L'avantage en est qu'il est
ainsi possible de ne pas montrer le type d'un document, et de
le modifier ult&#233;rieurement, par exemple le passer de <code>html</code>
&#224; <code>shtml</code> ou <code>cgi</code> sans avoir besoin de
modifier aucun lien.</p>
<p>Pour continuer &#224; utiliser les types MIME dans les liens
(par exemple, <code>foo.html</code>), l'extension correspondant
&#224; la langue (ainsi que l'extension d'encodage, si elle existe)
doit &#234;tre du cot&#233; droit de l'extension du type MIME (par exemple,
<code>foo.html.en</code>).</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
<div class="section">
<h2><a name="caching" id="caching">&#192; propos des Caches</a></h2>
<p>Quand un cache garde en m&#233;moire une repr&#233;sentation, il l'associe
&#224; l'URL de la requ&#234;te. Quand la m&#234;me URL vient &#224; &#234;tre redemand&#233;e,
le cache peut utiliser la repr&#233;sentation gard&#233;e en m&#233;moire, plut&#244;t
que de refaire une requ&#234;te au serveur. Cependant, si la ressource
est n&#233;gociable cot&#233; serveur, le r&#233;sultat pourrait en &#234;tre que la
r&#233;ponse &#224; la premi&#232;re requ&#234;te mise en cache serait renvoy&#233;e de
fa&#231;on erron&#233;e. Pour pr&#233;venir ce probl&#232;me, Apache marque toutes
les r&#233;ponses issues d'une n&#233;gociation comme "non-cachables" par
les clients HTTP/1.0. Apache supporte les sp&#233;cifications du
protocole HTTP/1.1 en ce qui concerne la mise en cache des
r&#233;ponses n&#233;goci&#233;es.</p>
<p>Les requ&#234;tes venant d'un client conforme au protocole HTTP/1.0
(qu'il s'agisse d'un navigateur ou d'un serveur cache) peuvent
&#234;tre rendues "cachables" si la directive <code class="directive"><a href="./mod/mod_negociation.html#cachenegotiateddocs">CacheNegotiatedDocs</a></code> est
utilis&#233;e. Cette directive peut &#234;tre sp&#233;cifi&#233;e aussi bien dans
la configuration principale du serveur que dans un serveur
virtuel, et ne n&#233;cessite pas d'argument. Elle n'a aucun impact
sur les requ&#234;tes des clients fonctionnant en HTTP/1.1.</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
<div class="section">
<h2><a name="more" id="more">Plus d'Information</a></h2>
<p>Pour plus d'informations au sujet de la n&#233;gociation de contenu, voir
<a href="http://ppewww.ph.gla.ac.uk/~flavell/www/lang-neg.html">Language
Negotiation Notes</a> de Alan J. Flavell. Notez que ce
document ne sera peut-&#234;tre pas mis &#224; jour en fonction des
changements intervenus dans Apache 2.0.</p>
</div></div>
<div class="bottomlang">
<p><span>Langues Disponibles: </span><a href="./en/content-negotiation.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
<a href="./fr/content-negotiation.html" title="Fran&#231;ais">&nbsp;fr&nbsp;</a> |
<a href="./ja/content-negotiation.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
<a href="./ko/content-negotiation.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
<a href="./tr/content-negotiation.html" hreflang="tr" rel="alternate" title="T&#252;rk&#231;e">&nbsp;tr&nbsp;</a></p>
</div><div id="footer">
<p class="apache">Copyright 2013 The Apache Software Foundation.<br />Autoris&#233; sous <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
<p class="menu"><a href="./mod/">Modules</a> | <a href="./mod/directives.html">Directives</a> | <a href="./faq/">FAQ</a> | <a href="./glossary.html">Glossaire</a> | <a href="./sitemap.html">Plan du site</a></p></div>
</body></html>