content-negotiation.xml revision d8567bc6f545b94892151fb050e99f44366dcf2f
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<?xml version='1.0' encoding='UTF-8' ?>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<!DOCTYPE manualpage SYSTEM "/style/manualpage.dtd">
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<?xml-stylesheet type="text/xsl" href="/style/manual.en.xsl"?>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<manualpage>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<relativepath href="."/>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<title>Content Negotiation</title>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<summary>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>Apache's supports content negotiation as described in
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive the HTTP/1.1 specification. It can choose the best
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive representation of a resource based on the browser-supplied
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive preferences for media type, languages, character set and
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive encoding. It also implements a couple of features to give
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive more intelligent handling of requests from browsers that send
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive incomplete negotiation information.</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>Content negotiation is provided by the
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <module>mod_negotiation</module> module.
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive which is compiled in by default.</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive</summary>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<section id="about"><title>About Content Negotiation</title>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>A resource may be available in several different
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive representations. For example, it might be available in
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive different languages or different media types, or a combination.
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive One way of selecting the most appropriate choice is to give the
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive user an index page, and let them select. However it is often
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive possible for the server to choose automatically. This works
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive because browsers can send as part of each request information
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive about what representations they prefer. For example, a browser
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive could indicate that it would like to see information in French,
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive if possible, else English will do. Browsers indicate their
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive preferences by headers in the request. To request only French
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive representations, the browser would send</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<example>Accept-Language: fr</example>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>Note that this preference will only be applied when there is
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive a choice of representations and they vary by language.</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>As an example of a more complex request, this browser has
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive been configured to accept French and English, but prefer
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive French, and to accept various media types, preferring HTML over
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive plain text or other text types, and preferring GIF or JPEG over
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive other media types, but also allowing any other media type as a
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive last resort:</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<example>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive Accept-Language: fr; q=1.0, en; q=0.5<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive 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
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive</example>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>Apache supports 'server driven' content negotiation, as
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive defined in the HTTP/1.1 specification. It fully supports the
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive Accept, Accept-Language, Accept-Charset and Accept-Encoding
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive request headers. Apache also supports 'transparent'
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive content negotiation, which is an experimental negotiation
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive protocol defined in RFC 2295 and RFC 2296. It does not offer
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive support for 'feature negotiation' as defined in these RFCs. </p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>A <strong>resource</strong> is a conceptual entity
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive identified by a URI (RFC 2396). An HTTP server like Apache
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive provides access to <strong>representations</strong> of the
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive resource(s) within its namespace, with each representation in
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive the form of a sequence of bytes with a defined media type,
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive character set, encoding, etc. Each resource may be associated
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive with zero, one, or more than one representation at any given
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive time. If multiple representations are available, the resource
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive is referred to as <strong>negotiable</strong> and each of its
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive representations is termed a <strong>variant</strong>. The ways
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive in which the variants for a negotiable resource vary are called
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive the <strong>dimensions</strong> of negotiation.</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive</section>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<section id="negotiation"><title>Negotiation in Apache</title>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>In order to negotiate a resource, the server needs to be
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive given information about each of the variants. This is done in
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive one of two ways:</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <ul>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <li>Using a type map (<em>i.e.</em>, a <code>*.var</code>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive file) which names the files containing the variants
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive explicitly, or</li>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <li>Using a 'MultiViews' search, where the server does an
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive implicit filename pattern match and chooses from among the
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive results.</li>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive </ul>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <section id="type-map"><title>Using a type-map file</title>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>A type map is a document which is associated with the
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive handler named <code>type-map</code> (or, for
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive backwards-compatibility with older Apache configurations, the
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive mime type <code>application/x-type-map</code>). Note that to
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive use this feature, you must have a handler set in the
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive configuration that defines a file suffix as
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <code>type-map</code>; this is best done with a</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<example>AddHandler type-map .var</example>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>in the server configuration file.</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>Type map files should have the same name as the resource
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive which they are describing, and have an entry for each available
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive variant; these entries consist of contiguous HTTP-format header
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive lines. Entries for different variants are separated by blank
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive lines. Blank lines are illegal within an entry. It is
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive conventional to begin a map file with an entry for the combined
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive entity as a whole (although this is not required, and if
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive present will be ignored). An example map file is shown below.
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive This file would be named <code>foo.var</code>, as it describes
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive a resource named <code>foo</code>.</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<example>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive URI: foo<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive URI: foo.en.html<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive Content-type: text/html<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive Content-language: en<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive URI: foo.fr.de.html<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive Content-type: text/html;charset=iso-8859-2<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive Content-language: fr, de<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive</example>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>Note also that a typemap file will take precedence over the
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive filename's extension, even when Multiviews is on. If the
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive variants have different source qualities, that may be indicated
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive by the "qs" parameter to the media type, as in this picture
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive (available as jpeg, gif, or ASCII-art): </p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<example>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive URI: foo<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive URI: foo.jpeg<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive Content-type: image/jpeg; qs=0.8<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive URI: foo.gif<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive Content-type: image/gif; qs=0.5<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive URI: foo.txt<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive Content-type: text/plain; qs=0.01<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive</example>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>qs values can vary in the range 0.000 to 1.000. Note that
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive any variant with a qs value of 0.000 will never be chosen.
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive Variants with no 'qs' parameter value are given a qs factor of
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive 1.0. The qs parameter indicates the relative 'quality' of this
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive variant compared to the other available variants, independent
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive of the client's capabilities. For example, a jpeg file is
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive usually of higher source quality than an ascii file if it is
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive attempting to represent a photograph. However, if the resource
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive being represented is an original ascii art, then an ascii
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive representation would have a higher source quality than a jpeg
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive representation. A qs value is therefore specific to a given
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive variant depending on the nature of the resource it
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive represents.</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>The full list of headers recognized is available in the <a
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive href="mod/mod_negotiation.html#typemaps">mod_negotation
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive typemap</a> documentation.</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive</section>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<section id="multiviews"><title>Multiviews</title>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p><code>MultiViews</code> is a per-directory option, meaning it
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive can be set with an <directive module="core">Options</directive>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive directive within a <directive module="core"
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive type="section">Directory</directive>, <directive module="core"
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive type="section">Location</directive> or <directive module="core"
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive type="section">Files</directive> section in
d8567bc6f545b94892151fb050e99f44366dcf2fslive <code>httpd.conf</code>, or (if <directive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive module="core">AllowOverride</directive> is properly set) in
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <code>.htaccess</code> files. Note that <code>Options All</code>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive does not set <code>MultiViews</code>; you have to ask for it by
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive name.</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>The effect of <code>MultiViews</code> is as follows: if the
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive server receives a request for <code>/some/dir/foo</code>, if
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <code>/some/dir</code> has <code>MultiViews</code> enabled, and
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <code>/some/dir/foo</code> does <em>not</em> exist, then the
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive server reads the directory looking for files named foo.*, and
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive effectively fakes up a type map which names all those files,
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive assigning them the same media types and content-encodings it
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive would have if the client had asked for one of them by name. It
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive then chooses the best match to the client's requirements.</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p><code>MultiViews</code> may also apply to searches for the file
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive named by the <directive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive module="mod_dir">DirectoryIndex</directive> directive, if the
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive server is trying to index a directory. If the configuration files
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive specify</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<example>DirectoryIndex index</example>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>then the server will arbitrate between <code>index.html</code>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive and <code>index.html3</code> if both are present. If neither
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive are present, and <code>index.cgi</code> is there, the server
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive will run it.</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>If one of the files found when reading the directory does not
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive have an extension recognized by <code>mod_mime</code> to designate
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive its Charset, Content-Type, Language, or Encoding, then the result
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive depends on the setting of the <directive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive module="mod_mime">MultiViewsMatch</directive> directive. This
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive directive determines whether handlers, filters, and other
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive extension types can participate in MultiViews negotiation.</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive</section>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive</section>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<section id="methods"><title>The Negotiation Methods</title>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>After Apache has obtained a list of the variants for a given
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive resource, either from a type-map file or from the filenames in
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive the directory, it invokes one of two methods to decide on the
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive 'best' variant to return, if any. It is not necessary to know
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive any of the details of how negotiation actually takes place in
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive order to use Apache's content negotiation features. However the
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive rest of this document explains the methods used for those
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive interested. </p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>There are two negotiation methods:</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <ol>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <li><strong>Server driven negotiation with the Apache
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive algorithm</strong> is used in the normal case. The Apache
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive algorithm is explained in more detail below. When this
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive algorithm is used, Apache can sometimes 'fiddle' the quality
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive factor of a particular dimension to achieve a better result.
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive The ways Apache can fiddle quality factors is explained in
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive more detail below.</li>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <li><strong>Transparent content negotiation</strong> is used
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive when the browser specifically requests this through the
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive mechanism defined in RFC 2295. This negotiation method gives
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive the browser full control over deciding on the 'best' variant,
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive the result is therefore dependent on the specific algorithms
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive used by the browser. As part of the transparent negotiation
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive process, the browser can ask Apache to run the 'remote
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive variant selection algorithm' defined in RFC 2296.</li>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive </ol>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<section id="dimensions"><title>Dimensions of Negotiation</title>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <table>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <tr valign="top">
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <th>Dimension</th>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <th>Notes</th>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive </tr>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <tr valign="top">
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <td>Media Type</td>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <td>Browser indicates preferences with the Accept header
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive field. Each item can have an associated quality factor.
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive Variant description can also have a quality factor (the
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive "qs" parameter).</td>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive </tr>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <tr valign="top">
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <td>Language</td>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <td>Browser indicates preferences with the Accept-Language
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive header field. Each item can have a quality factor. Variants
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive can be associated with none, one or more than one
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive language.</td>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive </tr>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <tr valign="top">
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <td>Encoding</td>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <td>Browser indicates preference with the Accept-Encoding
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive header field. Each item can have a quality factor.</td>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive </tr>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <tr valign="top">
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <td>Charset</td>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <td>Browser indicates preference with the Accept-Charset
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive header field. Each item can have a quality factor. Variants
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive can indicate a charset as a parameter of the media
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive type.</td>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive </tr>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive </table>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive</section>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<section id="algorithm"><title>Apache Negotiation Algorithm</title>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>Apache can use the following algorithm to select the 'best'
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive variant (if any) to return to the browser. This algorithm is
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive not further configurable. It operates as follows:</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <ol>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <li>First, for each dimension of the negotiation, check the
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive appropriate <em>Accept*</em> header field and assign a
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive quality to each variant. If the <em>Accept*</em> header for
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive any dimension implies that this variant is not acceptable,
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive eliminate it. If no variants remain, go to step 4.</li>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <li>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive Select the 'best' variant by a process of elimination. Each
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive of the following tests is applied in order. Any variants
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive not selected at each test are eliminated. After each test,
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive if only one variant remains, select it as the best match
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive and proceed to step 3. If more than one variant remains,
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive move on to the next test.
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <ol>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <li>Multiply the quality factor from the Accept header
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive with the quality-of-source factor for this variant's
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive media type, and select the variants with the highest
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive value.</li>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <li>Select the variants with the highest language quality
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive factor.</li>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <li>Select the variants with the best language match,
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive using either the order of languages in the
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive Accept-Language header (if present), or else the order of
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive languages in the <code>LanguagePriority</code> directive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive (if present).</li>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <li>Select the variants with the highest 'level' media
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive parameter (used to give the version of text/html media
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive types).</li>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <li>Select variants with the best charset media
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive parameters, as given on the Accept-Charset header line.
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive Charset ISO-8859-1 is acceptable unless explicitly
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive excluded. Variants with a <code>text/*</code> media type
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive but not explicitly associated with a particular charset
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive are assumed to be in ISO-8859-1.</li>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <li>Select those variants which have associated charset
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive media parameters that are <em>not</em> ISO-8859-1. If
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive there are no such variants, select all variants
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive instead.</li>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <li>Select the variants with the best encoding. If there
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive are variants with an encoding that is acceptable to the
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive user-agent, select only these variants. Otherwise if
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive there is a mix of encoded and non-encoded variants,
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive select only the unencoded variants. If either all
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive variants are encoded or all variants are not encoded,
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive select all variants.</li>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <li>Select the variants with the smallest content
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive length.</li>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <li>Select the first variant of those remaining. This
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive will be either the first listed in the type-map file, or
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive when variants are read from the directory, the one whose
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive file name comes first when sorted using ASCII code
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive order.</li>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive </ol>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive </li>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <li>The algorithm has now selected one 'best' variant, so
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive return it as the response. The HTTP response header Vary is
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive set to indicate the dimensions of negotiation (browsers and
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive caches can use this information when caching the resource).
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive End.</li>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <li>To get here means no variant was selected (because none
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive are acceptable to the browser). Return a 406 status (meaning
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive "No acceptable representation") with a response body
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive consisting of an HTML document listing the available
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive variants. Also set the HTTP Vary header to indicate the
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive dimensions of variance.</li>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive </ol>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive</section>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive</section>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<section id="better"><title>Fiddling with Quality
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive Values</title>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>Apache sometimes changes the quality values from what would
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive be expected by a strict interpretation of the Apache
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive negotiation algorithm above. This is to get a better result
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive from the algorithm for browsers which do not send full or
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive accurate information. Some of the most popular browsers send
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive Accept header information which would otherwise result in the
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive selection of the wrong variant in many cases. If a browser
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive sends full and correct information these fiddles will not be
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive applied.</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<section id="wildcards"><title>Media Types and Wildcards</title>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>The Accept: request header indicates preferences for media
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive types. It can also include 'wildcard' media types, such as
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive "image/*" or "*/*" where the * matches any string. So a request
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive including:</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<example>Accept: image/*, */*</example>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>would indicate that any type starting "image/" is acceptable,
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive as is any other type (so the first "image/*" is redundant).
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive Some browsers routinely send wildcards in addition to explicit
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive types they can handle. For example:</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<example>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive Accept: text/html, text/plain, image/gif, image/jpeg, */*
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive</example>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>The intention of this is to indicate that the explicitly listed
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive types are preferred, but if a different representation is
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive available, that is ok too. However under the basic algorithm,
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive as given above, the */* wildcard has exactly equal preference
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive to all the other types, so they are not being preferred. The
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive browser should really have sent a request with a lower quality
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive (preference) value for *.*, such as:</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<example>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive Accept: text/html, text/plain, image/gif, image/jpeg, */*; q=0.01
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive</example>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>The explicit types have no quality factor, so they default to a
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive preference of 1.0 (the highest). The wildcard */* is given a
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive low preference of 0.01, so other types will only be returned if
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive no variant matches an explicitly listed type.</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>If the Accept: header contains <em>no</em> q factors at all,
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive Apache sets the q value of "*/*", if present, to 0.01 to
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive emulate the desired behavior. It also sets the q value of
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive wildcards of the format "type/*" to 0.02 (so these are
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive preferred over matches against "*/*". If any media type on the
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive Accept: header contains a q factor, these special values are
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <em>not</em> applied, so requests from browsers which send the
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive correct information to start with work as expected.</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive</section>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<section id="exceptions"><title>Language Negotiation Exceptions</title>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>New in Apache 2.0, some exceptions have been added to the
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive negotiation algorithm to allow graceful fallback when language
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive negotiation fails to find a match.</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>When a client requests a page on your server, but the server
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive cannot find a single page that matches the Accept-language sent by
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive the browser, the server will return either a "No Acceptable
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive Variant" or "Multiple Choices" response to the client. To avoid
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive these error messages, it is possible to configure Apache to ignore
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive the Accept-language in these cases and provide a document that
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive does not explictly match the client's request. The <directive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive module="mod_negotiation">ForceLanguagePriority</directive>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive directive can be used to override one or both of these error
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive messages and subsitute the servers judgement in the form of the
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <directive module="mod_negotiation">LanguagePriority</directive>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive directive.</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>The server will also attempt to match language-subsets when no
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive other match can be found. For example, if a client requests
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive documents with the language <code>en-GB</code> for British
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive English, the server is not normally allowed by the HTTP/1.1
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive standard to match that against a document that is marked as simply
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <code>en</code>. (Note that it is almost surely a configuration
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive error to include <code>en-GB</code> and not <code>en</code> in the
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive Accept-Language header, since it is very unlikely that a reader
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive understands British English, but doesn't understand English in
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive general. Unfortunately, many current clients have default
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive configurations that resemble this.) However, if no other language
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive match is possible and the server is about to return a "No
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive Acceptable Variants" error or fallback to the <directive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive module="mod_negotiation">LanguagePriority</directive>, the server
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive will ignore the subset specification and match <code>en-GB</code>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive against <code>en</code> documents. Implicitly, Apache will add
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive the parent language to the client's acceptable language list with
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive a very low quality value. But note that if the client requests
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive "en-GB; qs=0.9, fr; qs=0.8", and the server has documents
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive designated "en" and "fr", then the "fr" document will be returned.
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive This is necessary to maintain compliance with the HTTP/1.1
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive specification and to work effectively with properly configured
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive clients.</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive</section>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive</section>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<section id="extensions"><title>Extensions to Transparent Content
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16sliveNegotiation</title>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<p>Apache extends the transparent content negotiation protocol (RFC
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive2295) as follows. A new <code>{encoding ..}</code> element is used in
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slivevariant lists to label variants which are available with a specific
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slivecontent-encoding only. The implementation of the RVSA/1.0 algorithm
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive(RFC 2296) is extended to recognize encoded variants in the list, and
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16sliveto use them as candidate variants whenever their encodings are
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16sliveacceptable according to the Accept-Encoding request header. The
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16sliveRVSA/1.0 implementation does not round computed quality factors to 5
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slivedecimal places before choosing the best variant.</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive</section>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<section id="naming"><title>Note on hyperlinks and naming conventions</title>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>If you are using language negotiation you can choose between
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive different naming conventions, because files can have more than
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive one extension, and the order of the extensions is normally
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive irrelevant (see the <a
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive href="mod/mod_mime.html#multipleext">mod_mime</a> documentation
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive for details).</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>A typical file has a MIME-type extension (<em>e.g.</em>,
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <code>html</code>), maybe an encoding extension (<em>e.g.</em>,
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <code>gz</code>), and of course a language extension
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive (<em>e.g.</em>, <code>en</code>) when we have different
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive language variants of this file.</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>Examples:</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <ul>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <li>foo.en.html</li>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <li>foo.html.en</li>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <li>foo.en.html.gz</li>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive </ul>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>Here some more examples of filenames together with valid and
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive invalid hyperlinks:</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <table border="1" cellpadding="8" cellspacing="0">
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <tr>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <th>Filename</th>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <th>Valid hyperlink</th>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <th>Invalid hyperlink</th>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive </tr>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <tr>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <td><em>foo.html.en</em></td>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <td>foo<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive foo.html</td>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <td>-</td>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive </tr>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <tr>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <td><em>foo.en.html</em></td>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <td>foo</td>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <td>foo.html</td>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive </tr>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <tr>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <td><em>foo.html.en.gz</em></td>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <td>foo<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive foo.html</td>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <td>foo.gz<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive foo.html.gz</td>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive </tr>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <tr>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <td><em>foo.en.html.gz</em></td>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <td>foo</td>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <td>foo.html<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive foo.html.gz<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive foo.gz</td>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive </tr>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <tr>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <td><em>foo.gz.html.en</em></td>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <td>foo<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive foo.gz<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive foo.gz.html</td>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <td>foo.html</td>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive </tr>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <tr>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <td><em>foo.html.gz.en</em></td>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <td>foo<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive foo.html<br />
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive foo.html.gz</td>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <td>foo.gz</td>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive </tr>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive </table>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>Looking at the table above you will notice that it is always
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive possible to use the name without any extensions in an hyperlink
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive (<em>e.g.</em>, <code>foo</code>). The advantage is that you
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive can hide the actual type of a document rsp. file and can change
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive it later, <em>e.g.</em>, from <code>html</code> to
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <code>shtml</code> or <code>cgi</code> without changing any
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive hyperlink references.</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>If you want to continue to use a MIME-type in your
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive hyperlinks (<em>e.g.</em> <code>foo.html</code>) the language
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive extension (including an encoding extension if there is one)
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive must be on the right hand side of the MIME-type extension
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive (<em>e.g.</em>, <code>foo.html.en</code>).</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive</section>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<section id="caching"><title>Note on Caching</title>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>When a cache stores a representation, it associates it with
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive the request URL. The next time that URL is requested, the cache
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive can use the stored representation. But, if the resource is
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive negotiable at the server, this might result in only the first
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive requested variant being cached and subsequent cache hits might
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive return the wrong response. To prevent this, Apache normally
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive marks all responses that are returned after content negotiation
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive as non-cacheable by HTTP/1.0 clients. Apache also supports the
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive HTTP/1.1 protocol features to allow caching of negotiated
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive responses.</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>For requests which come from a HTTP/1.0 compliant client
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive (either a browser or a cache), the directive <directive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive module="mod_negotiation">CacheNegotiatedDocs</directive> can be
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive used to allow caching of responses which were subject to
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive negotiation. This directive can be given in the server config or
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive virtual host, and takes no arguments. It has no effect on requests
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive from HTTP/1.1 clients.</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive</section>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive<section id="more"><title>More Information</title>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive <p>For more information about content negotiation, see Alan
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive J. Flavell's <a
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive href="http://ppewww.ph.gla.ac.uk/~flavell/www/lang-neg.html">Language
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive Negotiation Notes</a>. But note that this document may not be
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive updated to include changes in Apache 2.0.</p>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive</section>
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive
dd9f0e560e29dc86fba5f5d4fa5e72cda5cefb16slive</manualpage>