<?xml version="1.0"?>
<!DOCTYPE modulesynopsis SYSTEM "../style/modulesynopsis.dtd">
<?xml-stylesheet type="text/xsl" href="../style/manual.en.xsl"?>
<!-- $Revision: 1.16 $ -->

<!--
 Copyright 2002-2004 The Apache Software Foundation

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->

<modulesynopsis metafile="mod_negotiation.xml.meta">

<name>mod_negotiation</name>
<description>Provides for <a
    href="../content-negotiation.html">content negotiation</a></description>
<status>Base</status>
<sourcefile>mod_negotiation.c</sourcefile>
<identifier>negotiation_module</identifier>

<summary>
    <p>Content negotiation, or more accurately content selection, is
    the selection of the document that best matches the clients
    capabilities, from one of several available documents. There
    are two implementations of this.</p>

    <ul>
      <li>A type map (a file with the handler
      <code>type-map</code>) which explicitly lists the files
      containing the variants.</li>

      <li>A MultiViews search (enabled by the <code>MultiViews</code>
      <directive module="core">Options</directive>), where the server does
      an implicit filename pattern match, and choose from amongst the
      results.</li>
    </ul>
</summary>
<seealso><directive module="core">Options</directive></seealso>
<seealso><module>mod_mime</module></seealso>
<seealso><a href="../content-negotiation.html">Content
Negotiation</a></seealso>
<seealso><a href="../env.html">Environment Variables</a></seealso>

<section id="typemaps"><title>Type maps</title>
    <p>A type map has a format similar to RFC822 mail headers. It
    contains document descriptions separated by blank lines, with
    lines beginning with a hash character ('#') treated as
    comments. A document description consists of several header
    records; records may be continued on multiple lines if the
    continuation lines start with spaces. The leading space will be
    deleted and the lines concatenated. A header record consists of
    a keyword name, which always ends in a colon, followed by a
    value. Whitespace is allowed between the header name and value,
    and between the tokens of value. The headers allowed are: </p>

    <dl>
      <dt><code>Content-Encoding:</code></dt>
      <dd>The encoding of the file. Apache only recognizes
      encodings that are defined by an <directive
      module="mod_mime">AddEncoding</directive> directive.
      This normally includes the encodings <code>x-compress</code>
      for compress'd files, and <code>x-gzip</code> for gzip'd
      files. The <code>x-</code> prefix is ignored for encoding
      comparisons.</dd>

      <dt><code>Content-Language:</code></dt>
      <dd>The language(s) of the variant, as an Internet standard
      language tag (<a href="http://www.ietf.org/rfc/rfc1766.txt"
      >RFC 1766</a>). An example is <code>en</code>,
      meaning English. If the variant contains more than one
      language, they are separated by a comma.</dd>

      <dt><code>Content-Length:</code></dt>
      <dd>The length of the file, in bytes. If this header is not
      present, then the actual length of the file is used.</dd>

      <dt><code>Content-Type:</code></dt>

      <dd>
        The MIME media type of the document, with optional
        parameters. Parameters are separated from the media type
        and from one another by a semi-colon, with a syntax of
        <code>name=value</code>. Common parameters include: 

        <dl>
          <dt><code>level</code></dt>
          <dd>an integer specifying the version of the media type.
          For <code>text/html</code> this defaults to 2, otherwise
          0.</dd>

          <dt><code>qs</code></dt>
          <dd>a floating-point number with a value in the range 0.0
          to 1.0, indicating the relative 'quality' of this variant
          compared to the other available variants, independent of
          the client's capabilities. For example, a jpeg file is
          usually of higher source quality than an ascii file if it
          is attempting to represent a photograph. However, if the
          resource being represented is ascii art, then an ascii
          file would have a higher source quality than a jpeg file.
          All <code>qs</code> values are therefore specific to a given
          resource.</dd>
        </dl>

        <example><title>Example</title>
          Content-Type: image/jpeg; qs=0.8
        </example>
      </dd>

      <dt><code>URI:</code></dt>
      <dd>uri of the file containing the variant (of the given
      media type, encoded with the given content encoding). These
      are interpreted as URLs relative to the map file; they must
      be on the same server (!), and they must refer to files to
      which the client would be granted access if they were to be
      requested directly.</dd>

      <dt><code>Body:</code></dt>
      <dd>New in Apache 2.0, the actual content of the resource may
      be included in the type-map file using the Body header.  This
      header must contain a string that designates a delimiter for
      the body content. Then all following lines in the type map
      file will be considered part of the resource body until the
      delimiter string is found.

      <example><title>Example:</title>
        Body:----xyz----<br />
        &lt;html&gt;<br />
        &lt;body&gt;<br />
        &lt;p&gt;Content of the page.&lt;/p&gt;<br />
        &lt;/body&gt;<br />
        &lt;/html&gt;<br />
        ----xyz----
      </example>
      </dd>
    </dl>
</section>

<section id="multiviews"><title>MultiViews</title>
    <p>A MultiViews search is enabled by the <code>MultiViews</code>
    <directive module="core">Options</directive>. If the server receives a
    request for <code>/some/dir/foo</code> and
    <code>/some/dir/foo</code> does <em>not</em> exist, then the
    server reads the directory looking for all files named
    <code>foo.*</code>, and effectively fakes up a type map which
    names all those files, assigning them the same media types and
    content-encodings it would have if the client had asked for one
    of them by name. It then chooses the best match to the client's
    requirements, and returns that document.</p>

    <p>The <directive module="mod_mime">MultiViewsMatch</directive>
    directive configures whether Apache will consider files
    that do not have content negotiation meta-information assigned
    to them when choosing files.</p>
</section>

<directivesynopsis>
<name>CacheNegotiatedDocs</name>
<description>Allows content-negotiated documents to be 
cached by proxy servers</description>
<syntax>CacheNegotiatedDocs On|Off</syntax>
<default>CacheNegotiatedDocs Off</default>
<contextlist><context>server config</context><context>virtual host</context>
</contextlist>
<compatibility>The syntax changed in version 2.0.</compatibility>

<usage>
    <p>If set, this directive allows content-negotiated documents
    to be cached by proxy servers. This could mean that clients
    behind those proxys could retrieve versions of the documents
    that are not the best match for their abilities, but it will
    make caching more efficient.</p>

    <p>This directive only applies to requests which come from
    HTTP/1.0 browsers. HTTP/1.1 provides much better control over
    the caching of negotiated documents, and this directive has no
    effect in responses to HTTP/1.1 requests.</p>

    <p>Prior to version 2.0,
    <directive>CacheNegotiatedDocs</directive> did not take an
    argument; it was turned on by the presence of the directive by
    itself.</p>
</usage>
</directivesynopsis>

<directivesynopsis>
<name>ForceLanguagePriority</name>
<description>Action to take if a single acceptable document is not 
found</description>
<syntax>ForceLanguagePriority None|Prefer|Fallback [Prefer|Fallback]</syntax>
<default>ForceLanguagePriority Prefer</default>
<contextlist><context>server config</context><context>virtual host</context>
<context>directory</context><context>.htaccess</context></contextlist>
<override>FileInfo</override>
<compatibility>Available in version 2.0.30 and later</compatibility>

<usage>
    <p>The <directive>ForceLanguagePriority</directive> directive uses
    the given <directive
    module="mod_negotiation">LanguagePriority</directive> to satisfy
    negotation where the server could otherwise not return a single
    matching document.</p>

    <p><code>ForceLanguagePriority Prefer</code> uses
    <code>LanguagePriority</code> to serve a one valid result, rather
    than returning an HTTP result 300 (MULTIPLE CHOICES) when there
    are several equally valid choices.  If the directives below were
    given, and the user's <code>Accept-Language</code> header assigned
    <code>en</code> and <code>de</code> each as quality <code>.500</code>
    (equally acceptable) then the first matching variant, <code>en</code>,
    will be served.</p>

    <example>
      LanguagePriority en fr de<br />
      ForceLanguagePriority Prefer
    </example>

    <p><code>ForceLanguagePriority Fallback</code> uses
    <directive module="mod_negotiation">LanguagePriority</directive> to
    serve a valid result, rather than returning an HTTP result 406
    (NOT ACCEPTABLE). If the directives below were given, and the user's
    <code>Accept-Language</code> only permitted an <code>es</code>
    language response, but such a variant isn't found, then the first
    variant from the <directive module="mod_negotiation"
    >LanguagePriority</directive> list below will be served.</p>

    <example>
      LanguagePriority en fr de<br />
      ForceLanguagePriority Fallback
    </example>

    <p>Both options, <code>Prefer</code> and <code>Fallback</code>, may be
    specified, so either the first matching variant from <directive
    module="mod_negotiation">LanguagePriority</directive> will be served if
    more than one variant is acceptable, or first available document will
    be served if none of the variants matched the client's acceptable list
    of languages.</p>
</usage>
<seealso><directive module="mod_mime">AddLanguage</directive></seealso>
</directivesynopsis>

<directivesynopsis>
<name>LanguagePriority</name>
<description>The precendence of language variants for cases where
the client does not express a preference</description>
<syntax>LanguagePriority <var>MIME-lang</var> [<var>MIME-lang</var>]
...</syntax>
<contextlist><context>server config</context><context>virtual host</context>
<context>directory</context><context>.htaccess</context></contextlist>
<override>FileInfo</override>

<usage>
    <p>The <directive>LanguagePriority</directive> sets the precedence
    of language variants for the case where the client does not
    express a preference, when handling a MultiViews request. The list
    of <var>MIME-lang</var> are in order of decreasing preference.</p>

    <example><title>Example:</title>
      LanguagePriority en fr de
    </example>

    <p>For a request for <code>foo.html</code>, where
    <code>foo.html.fr</code> and <code>foo.html.de</code> both
    existed, but the browser did not express a language preference,
    then <code>foo.html.fr</code> would be returned.</p>

    <p>Note that this directive only has an effect if a 'best'
    language cannot be determined by any other means or the <directive
    module="mod_negotiation">ForceLanguagePriority</directive> directive
    is not <code>None</code>. In general, the client determines the
    language preference, not the server.</p>
</usage>
<seealso><directive module="mod_mime">AddLanguage</directive></seealso>
</directivesynopsis>

</modulesynopsis>
