]> granicus.if.org Git - apache/blob - docs/manual/content-negotiation.xml
update transformation.
[apache] / docs / manual / content-negotiation.xml
1 <?xml version='1.0' encoding='UTF-8' ?>
2 <!DOCTYPE manualpage SYSTEM "./style/manualpage.dtd">
3 <?xml-stylesheet type="text/xsl" href="./style/manual.en.xsl"?>
4 <!-- $LastChangedRevision$ -->
5
6 <!--
7  Copyright 2002-2005 The Apache Software Foundation or its licensors, as
8  applicable.
9
10  Licensed under the Apache License, Version 2.0 (the "License");
11  you may not use this file except in compliance with the License.
12  You may obtain a copy of the License at
13
14      http://www.apache.org/licenses/LICENSE-2.0
15
16  Unless required by applicable law or agreed to in writing, software
17  distributed under the License is distributed on an "AS IS" BASIS,
18  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19  See the License for the specific language governing permissions and
20  limitations under the License.
21 -->
22
23 <manualpage metafile="content-negotiation.xml.meta">
24
25 <title>Content Negotiation</title>
26
27 <summary>
28
29     <p>Apache supports content negotiation as described in
30     the HTTP/1.1 specification. It can choose the best
31     representation of a resource based on the browser-supplied
32     preferences for media type, languages, character set and
33     encoding. It also implements a couple of features to give
34     more intelligent handling of requests from browsers that send
35     incomplete negotiation information.</p>
36
37     <p>Content negotiation is provided by the
38     <module>mod_negotiation</module> module, which is compiled in
39     by default.</p>
40 </summary>
41
42 <section id="about"><title>About Content Negotiation</title>
43
44     <p>A resource may be available in several different
45     representations. For example, it might be available in
46     different languages or different media types, or a combination.
47     One way of selecting the most appropriate choice is to give the
48     user an index page, and let them select. However it is often
49     possible for the server to choose automatically. This works
50     because browsers can send, as part of each request, information
51     about what representations they prefer. For example, a browser
52     could indicate that it would like to see information in French,
53     if possible, else English will do. Browsers indicate their
54     preferences by headers in the request. To request only French
55     representations, the browser would send</p>
56
57 <example>Accept-Language: fr</example>
58
59     <p>Note that this preference will only be applied when there is
60     a choice of representations and they vary by language.</p>
61
62     <p>As an example of a more complex request, this browser has
63     been configured to accept French and English, but prefer
64     French, and to accept various media types, preferring HTML over
65     plain text or other text types, and preferring GIF or JPEG over
66     other media types, but also allowing any other media type as a
67     last resort:</p>
68
69 <example>
70   Accept-Language: fr; q=1.0, en; q=0.5<br />
71   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
72 </example>
73
74     <p>Apache supports 'server driven' content negotiation, as
75     defined in the HTTP/1.1 specification. It fully supports the
76     <code>Accept</code>, <code>Accept-Language</code>,
77     <code>Accept-Charset</code> and<code>Accept-Encoding</code> 
78     request headers. Apache also supports 'transparent'
79     content negotiation, which is an experimental negotiation
80     protocol defined in RFC 2295 and RFC 2296. It does not offer
81     support for 'feature negotiation' as defined in these RFCs.</p>
82
83     <p>A <strong>resource</strong> is a conceptual entity
84     identified by a URI (RFC 2396). An HTTP server like Apache
85     provides access to <strong>representations</strong> of the
86     resource(s) within its namespace, with each representation in
87     the form of a sequence of bytes with a defined media type,
88     character set, encoding, etc. Each resource may be associated
89     with zero, one, or more than one representation at any given
90     time. If multiple representations are available, the resource
91     is referred to as <strong>negotiable</strong> and each of its
92     representations is termed a <strong>variant</strong>. The ways
93     in which the variants for a negotiable resource vary are called
94     the <strong>dimensions</strong> of negotiation.</p>
95 </section>
96
97 <section id="negotiation"><title>Negotiation in Apache</title>
98
99     <p>In order to negotiate a resource, the server needs to be
100     given information about each of the variants. This is done in
101     one of two ways:</p>
102
103     <ul>
104       <li>Using a type map (<em>i.e.</em>, a <code>*.var</code>
105       file) which names the files containing the variants
106       explicitly, or</li>
107
108       <li>Using a 'MultiViews' search, where the server does an
109       implicit filename pattern match and chooses from among the
110       results.</li>
111     </ul>
112
113    <section id="type-map"><title>Using a type-map file</title>
114
115     <p>A type map is a document which is associated with the
116     handler named <code>type-map</code> (or, for
117     backwards-compatibility with older Apache configurations, the
118     MIME type <code>application/x-type-map</code>). Note that to
119     use this feature, you must have a handler set in the
120     configuration that defines a file suffix as
121     <code>type-map</code>; this is best done with</p>
122
123 <example>AddHandler type-map .var</example>
124
125     <p>in the server configuration file.</p>
126
127     <p>Type map files should have the same name as the resource
128     which they are describing, and have an entry for each available
129     variant; these entries consist of contiguous HTTP-format header
130     lines. Entries for different variants are separated by blank
131     lines. Blank lines are illegal within an entry. It is
132     conventional to begin a map file with an entry for the combined
133     entity as a whole (although this is not required, and if
134     present will be ignored). An example map file is shown below.
135     This file would be named <code>foo.var</code>, as it describes
136     a resource named <code>foo</code>.</p>
137
138 <example>
139   URI: foo<br />
140 <br />
141   URI: foo.en.html<br />
142   Content-type: text/html<br />
143   Content-language: en<br />
144 <br />
145   URI: foo.fr.de.html<br />
146   Content-type: text/html;charset=iso-8859-2<br />
147   Content-language: fr, de<br />
148 </example>
149     <p>Note also that a typemap file will take precedence over the
150     filename's extension, even when Multiviews is on. If the
151     variants have different source qualities, that may be indicated
152     by the "qs" parameter to the media type, as in this picture
153     (available as JPEG, GIF, or ASCII-art): </p>
154
155 <example>
156   URI: foo<br />
157 <br />
158   URI: foo.jpeg<br />
159   Content-type: image/jpeg; qs=0.8<br />
160 <br />
161   URI: foo.gif<br />
162   Content-type: image/gif; qs=0.5<br />
163 <br />
164   URI: foo.txt<br />
165   Content-type: text/plain; qs=0.01<br />
166 </example>
167
168     <p>qs values can vary in the range 0.000 to 1.000. Note that
169     any variant with a qs value of 0.000 will never be chosen.
170     Variants with no 'qs' parameter value are given a qs factor of
171     1.0. The qs parameter indicates the relative 'quality' of this
172     variant compared to the other available variants, independent
173     of the client's capabilities. For example, a JPEG file is
174     usually of higher source quality than an ASCII file if it is
175     attempting to represent a photograph. However, if the resource
176     being represented is an original ASCII art, then an ASCII
177     representation would have a higher source quality than a JPEG
178     representation. A qs value is therefore specific to a given
179     variant depending on the nature of the resource it
180     represents.</p>
181
182     <p>The full list of headers recognized is available in the <a
183     href="mod/mod_negotiation.html#typemaps">mod_negotation
184     typemap</a> documentation.</p>
185 </section>
186
187 <section id="multiviews"><title>Multiviews</title>
188
189     <p><code>MultiViews</code> is a per-directory option, meaning it
190     can be set with an <directive module="core">Options</directive>
191     directive within a <directive module="core"
192     type="section">Directory</directive>, <directive module="core"
193     type="section">Location</directive> or <directive module="core"
194     type="section">Files</directive> section in
195     <code>httpd.conf</code>, or (if <directive
196     module="core">AllowOverride</directive> is properly set) in
197     <code>.htaccess</code> files. Note that <code>Options All</code>
198     does not set <code>MultiViews</code>; you have to ask for it by
199     name.</p>
200
201     <p>The effect of <code>MultiViews</code> is as follows: if the
202     server receives a request for <code>/some/dir/foo</code>, if
203     <code>/some/dir</code> has <code>MultiViews</code> enabled, and
204     <code>/some/dir/foo</code> does <em>not</em> exist, then the
205     server reads the directory looking for files named foo.*, and
206     effectively fakes up a type map which names all those files,
207     assigning them the same media types and content-encodings it
208     would have if the client had asked for one of them by name. It
209     then chooses the best match to the client's requirements.</p>
210
211     <p><code>MultiViews</code> may also apply to searches for the file
212     named by the <directive
213     module="mod_dir">DirectoryIndex</directive> directive, if the
214     server is trying to index a directory. If the configuration files
215     specify</p>
216 <example>DirectoryIndex index</example>
217     <p>then the server will arbitrate between <code>index.html</code>
218     and <code>index.html3</code> if both are present. If neither
219     are present, and <code>index.cgi</code> is there, the server
220     will run it.</p>
221
222     <p>If one of the files found when reading the directory does not
223     have an extension recognized by <code>mod_mime</code> to designate
224     its Charset, Content-Type, Language, or Encoding, then the result
225     depends on the setting of the <directive
226     module="mod_mime">MultiViewsMatch</directive> directive.  This
227     directive determines whether handlers, filters, and other
228     extension types can participate in MultiViews negotiation.</p>
229 </section>
230 </section>
231
232 <section id="methods"><title>The Negotiation Methods</title>
233
234     <p>After Apache has obtained a list of the variants for a given
235     resource, either from a type-map file or from the filenames in
236     the directory, it invokes one of two methods to decide on the
237     'best' variant to return, if any. It is not necessary to know
238     any of the details of how negotiation actually takes place in
239     order to use Apache's content negotiation features. However the
240     rest of this document explains the methods used for those
241     interested. </p>
242
243     <p>There are two negotiation methods:</p>
244
245     <ol>
246       <li><strong>Server driven negotiation with the Apache
247       algorithm</strong> is used in the normal case. The Apache
248       algorithm is explained in more detail below. When this
249       algorithm is used, Apache can sometimes 'fiddle' the quality
250       factor of a particular dimension to achieve a better result.
251       The ways Apache can fiddle quality factors is explained in
252       more detail below.</li>
253
254       <li><strong>Transparent content negotiation</strong> is used
255       when the browser specifically requests this through the
256       mechanism defined in RFC 2295. This negotiation method gives
257       the browser full control over deciding on the 'best' variant,
258       the result is therefore dependent on the specific algorithms
259       used by the browser. As part of the transparent negotiation
260       process, the browser can ask Apache to run the 'remote
261       variant selection algorithm' defined in RFC 2296.</li>
262     </ol>
263
264 <section id="dimensions"><title>Dimensions of Negotiation</title>
265
266     <table>
267       <columnspec><column width=".15"/><column width=".85"/></columnspec>
268       <tr valign="top">
269         <th>Dimension</th>
270
271         <th>Notes</th>
272       </tr>
273
274       <tr valign="top">
275         <td>Media Type</td>
276
277         <td>Browser indicates preferences with the <code>Accept</code>
278         header field. Each item can have an associated quality factor.
279         Variant description can also have a quality factor (the "qs"
280         parameter).</td>
281       </tr>
282
283       <tr valign="top">
284         <td>Language</td>
285
286         <td>Browser indicates preferences with the
287         <code>Accept-Language</code> header field. Each item can have
288         a quality factor. Variants can be associated with none, one or
289         more than one language.</td>
290       </tr>
291
292       <tr valign="top">
293         <td>Encoding</td>
294
295         <td>Browser indicates preference with the
296         <code>Accept-Encoding</code> header field. Each item can have
297         a quality factor.</td>
298       </tr>
299
300       <tr valign="top">
301         <td>Charset</td>
302
303         <td>Browser indicates preference with the
304         <code>Accept-Charset</code> header field. Each item can have a
305         quality factor. Variants can indicate a charset as a parameter
306         of the media type.</td>
307       </tr>
308     </table>
309 </section>
310
311 <section id="algorithm"><title>Apache Negotiation Algorithm</title>
312
313     <p>Apache can use the following algorithm to select the 'best'
314     variant (if any) to return to the browser. This algorithm is
315     not further configurable. It operates as follows:</p>
316
317     <ol>
318       <li>First, for each dimension of the negotiation, check the
319       appropriate <em>Accept*</em> header field and assign a
320       quality to each variant. If the <em>Accept*</em> header for
321       any dimension implies that this variant is not acceptable,
322       eliminate it. If no variants remain, go to step 4.</li>
323
324       <li>
325         Select the 'best' variant by a process of elimination. Each
326         of the following tests is applied in order. Any variants
327         not selected at each test are eliminated. After each test,
328         if only one variant remains, select it as the best match
329         and proceed to step 3. If more than one variant remains,
330         move on to the next test. 
331
332         <ol>
333           <li>Multiply the quality factor from the <code>Accept</code>
334           header with the quality-of-source factor for this variants
335           media type, and select the variants with the highest
336           value.</li>
337
338           <li>Select the variants with the highest language quality
339           factor.</li>
340
341           <li>Select the variants with the best language match,
342           using either the order of languages in the
343           <code>Accept-Language</code> header (if present), or else
344           the order of languages in the <code>LanguagePriority</code>
345           directive (if present).</li>
346
347           <li>Select the variants with the highest 'level' media
348           parameter (used to give the version of text/html media
349           types).</li>
350
351           <li>Select variants with the best charset media
352           parameters, as given on the <code>Accept-Charset</code>
353           header line.  Charset ISO-8859-1 is acceptable unless
354           explicitly excluded. Variants with a <code>text/*</code>
355           media type but not explicitly associated with a particular
356           charset are assumed to be in ISO-8859-1.</li>
357
358           <li>Select those variants which have associated charset
359           media parameters that are <em>not</em> ISO-8859-1. If
360           there are no such variants, select all variants
361           instead.</li>
362
363           <li>Select the variants with the best encoding. If there
364           are variants with an encoding that is acceptable to the
365           user-agent, select only these variants. Otherwise if
366           there is a mix of encoded and non-encoded variants,
367           select only the unencoded variants. If either all
368           variants are encoded or all variants are not encoded,
369           select all variants.</li>
370
371           <li>Select the variants with the smallest content
372           length.</li>
373
374           <li>Select the first variant of those remaining. This
375           will be either the first listed in the type-map file, or
376           when variants are read from the directory, the one whose
377           file name comes first when sorted using ASCII code
378           order.</li>
379         </ol>
380       </li>
381
382       <li>The algorithm has now selected one 'best' variant, so
383       return it as the response. The HTTP response header
384       <code>Vary</code> is set to indicate the dimensions of
385       negotiation (browsers and caches can use this information when
386       caching the resource).  End.</li>
387
388       <li>To get here means no variant was selected (because none
389       are acceptable to the browser). Return a 406 status (meaning
390       "No acceptable representation") with a response body
391       consisting of an HTML document listing the available
392       variants. Also set the HTTP <code>Vary</code> header to
393       indicate the dimensions of variance.</li>
394     </ol>
395 </section>
396 </section>
397
398 <section id="better"><title>Fiddling with Quality
399     Values</title>
400
401     <p>Apache sometimes changes the quality values from what would
402     be expected by a strict interpretation of the Apache
403     negotiation algorithm above. This is to get a better result
404     from the algorithm for browsers which do not send full or
405     accurate information. Some of the most popular browsers send
406     <code>Accept</code> header information which would otherwise
407     result in the selection of the wrong variant in many cases. If a
408     browser sends full and correct information these fiddles will not
409     be applied.</p>
410
411 <section id="wildcards"><title>Media Types and Wildcards</title>
412
413     <p>The <code>Accept:</code> request header indicates preferences
414     for media types. It can also include 'wildcard' media types, such
415     as "image/*" or "*/*" where the * matches any string. So a request
416     including:</p>
417
418 <example>Accept: image/*, */*</example>
419
420     <p>would indicate that any type starting "image/" is acceptable,
421     as is any other type.
422     Some browsers routinely send wildcards in addition to explicit
423     types they can handle. For example:</p>
424
425 <example>
426   Accept: text/html, text/plain, image/gif, image/jpeg, */*
427 </example>
428     <p>The intention of this is to indicate that the explicitly listed
429     types are preferred, but if a different representation is
430     available, that is ok too.  Using explicit quality values,
431     what the browser really wants is something like:</p>
432 <example>
433   Accept: text/html, text/plain, image/gif, image/jpeg, */*; q=0.01
434 </example>
435     <p>The explicit types have no quality factor, so they default to a
436     preference of 1.0 (the highest). The wildcard */* is given a
437     low preference of 0.01, so other types will only be returned if
438     no variant matches an explicitly listed type.</p>
439
440     <p>If the <code>Accept:</code> header contains <em>no</em> q
441     factors at all, Apache sets the q value of "*/*", if present, to
442     0.01 to emulate the desired behavior. It also sets the q value of
443     wildcards of the format "type/*" to 0.02 (so these are preferred
444     over matches against "*/*". If any media type on the
445     <code>Accept:</code> header contains a q factor, these special
446     values are <em>not</em> applied, so requests from browsers which
447     send the explicit information to start with work as expected.</p>
448 </section>
449
450 <section id="exceptions"><title>Language Negotiation Exceptions</title>
451
452     <p>New in Apache 2.0, some exceptions have been added to the
453     negotiation algorithm to allow graceful fallback when language
454     negotiation fails to find a match.</p>
455
456     <p>When a client requests a page on your server, but the server
457     cannot find a single page that matches the
458     <code>Accept-language</code> sent by
459     the browser, the server will return either a "No Acceptable
460     Variant" or "Multiple Choices" response to the client.  To avoid
461     these error messages, it is possible to configure Apache to ignore
462     the <code>Accept-language</code> in these cases and provide a
463     document that does not explicitly match the client's request.  The
464     <directive
465     module="mod_negotiation">ForceLanguagePriority</directive>
466     directive can be used to override one or both of these error
467     messages and substitute the servers judgement in the form of the
468     <directive module="mod_negotiation">LanguagePriority</directive>
469     directive.</p>
470
471     <p>The server will also attempt to match language-subsets when no
472     other match can be found.  For example, if a client requests
473     documents with the language <code>en-GB</code> for British
474     English, the server is not normally allowed by the HTTP/1.1
475     standard to match that against a document that is marked as simply
476     <code>en</code>.  (Note that it is almost surely a configuration
477     error to include <code>en-GB</code> and not <code>en</code> in the
478     <code>Accept-Language</code> header, since it is very unlikely
479     that a reader understands British English, but doesn't understand
480     English in general.  Unfortunately, many current clients have
481     default configurations that resemble this.)  However, if no other
482     language match is possible and the server is about to return a "No
483     Acceptable Variants" error or fallback to the <directive
484     module="mod_negotiation">LanguagePriority</directive>, the server
485     will ignore the subset specification and match <code>en-GB</code>
486     against <code>en</code> documents.  Implicitly, Apache will add
487     the parent language to the client's acceptable language list with
488     a very low quality value.  But note that if the client requests
489     "en-GB; q=0.9, fr; q=0.8", and the server has documents
490     designated "en" and "fr", then the "fr" document will be returned.
491     This is necessary to maintain compliance with the HTTP/1.1
492     specification and to work effectively with properly configured
493     clients.</p>
494
495     <p>In order to support advanced techniques (such as cookies or
496     special URL-paths) to determine the user's preferred language,
497     since Apache 2.0.47 <module>mod_negotiation</module> recognizes
498     the <a href="env.html">environment variable</a>
499     <code>prefer-language</code>. If it exists and contains an
500     appropriate language tag, <module>mod_negotiation</module> will
501     try to select a matching variant. If there's no such variant,
502     the normal negotiation process applies.</p>
503
504     <example><title>Example</title>
505       SetEnvIf Cookie "language=(.+)" prefer-language=$1
506     </example>
507 </section>
508 </section>
509
510 <section id="extensions"><title>Extensions to Transparent Content
511 Negotiation</title> 
512
513 <p>Apache extends the transparent content negotiation protocol (RFC
514 2295) as follows. A new <code>{encoding ..}</code> element is used in
515 variant lists to label variants which are available with a specific
516 content-encoding only. The implementation of the RVSA/1.0 algorithm
517 (RFC 2296) is extended to recognize encoded variants in the list, and
518 to use them as candidate variants whenever their encodings are
519 acceptable according to the <code>Accept-Encoding</code> request
520 header. The RVSA/1.0 implementation does not round computed quality
521 factors to 5 decimal places before choosing the best variant.</p>
522 </section>
523
524 <section id="naming"><title>Note on hyperlinks and naming conventions</title>
525
526     <p>If you are using language negotiation you can choose between
527     different naming conventions, because files can have more than
528     one extension, and the order of the extensions is normally
529     irrelevant (see the <a
530     href="mod/mod_mime.html#multipleext">mod_mime</a> documentation
531     for details).</p>
532
533     <p>A typical file has a MIME-type extension (<em>e.g.</em>,
534     <code>html</code>), maybe an encoding extension (<em>e.g.</em>,
535     <code>gz</code>), and of course a language extension
536     (<em>e.g.</em>, <code>en</code>) when we have different
537     language variants of this file.</p>
538
539     <p>Examples:</p>
540
541     <ul>
542       <li>foo.en.html</li>
543
544       <li>foo.html.en</li>
545
546       <li>foo.en.html.gz</li>
547     </ul>
548
549     <p>Here some more examples of filenames together with valid and
550     invalid hyperlinks:</p>
551
552     <table border="1" cellpadding="8" cellspacing="0">
553       <columnspec><column width=".2"/><column width=".2"/>
554         <column width=".2"/></columnspec>
555       <tr>
556         <th>Filename</th>
557
558         <th>Valid hyperlink</th>
559
560         <th>Invalid hyperlink</th>
561       </tr>
562
563       <tr>
564         <td><em>foo.html.en</em></td>
565
566         <td>foo<br />
567          foo.html</td>
568
569         <td>-</td>
570       </tr>
571
572       <tr>
573         <td><em>foo.en.html</em></td>
574
575         <td>foo</td>
576
577         <td>foo.html</td>
578       </tr>
579
580       <tr>
581         <td><em>foo.html.en.gz</em></td>
582
583         <td>foo<br />
584          foo.html</td>
585
586         <td>foo.gz<br />
587          foo.html.gz</td>
588       </tr>
589
590       <tr>
591         <td><em>foo.en.html.gz</em></td>
592
593         <td>foo</td>
594
595         <td>foo.html<br />
596          foo.html.gz<br />
597          foo.gz</td>
598       </tr>
599
600       <tr>
601         <td><em>foo.gz.html.en</em></td>
602
603         <td>foo<br />
604          foo.gz<br />
605          foo.gz.html</td>
606
607         <td>foo.html</td>
608       </tr>
609
610       <tr>
611         <td><em>foo.html.gz.en</em></td>
612
613         <td>foo<br />
614          foo.html<br />
615          foo.html.gz</td>
616
617         <td>foo.gz</td>
618       </tr>
619     </table>
620
621     <p>Looking at the table above, you will notice that it is always
622     possible to use the name without any extensions in a hyperlink
623     (<em>e.g.</em>, <code>foo</code>). The advantage is that you
624     can hide the actual type of a document rsp. file and can change
625     it later, <em>e.g.</em>, from <code>html</code> to
626     <code>shtml</code> or <code>cgi</code> without changing any
627     hyperlink references.</p>
628
629     <p>If you want to continue to use a MIME-type in your
630     hyperlinks (<em>e.g.</em> <code>foo.html</code>) the language
631     extension (including an encoding extension if there is one)
632     must be on the right hand side of the MIME-type extension
633     (<em>e.g.</em>, <code>foo.html.en</code>).</p>
634 </section>
635
636 <section id="caching"><title>Note on Caching</title>
637
638     <p>When a cache stores a representation, it associates it with
639     the request URL. The next time that URL is requested, the cache
640     can use the stored representation. But, if the resource is
641     negotiable at the server, this might result in only the first
642     requested variant being cached and subsequent cache hits might
643     return the wrong response. To prevent this, Apache normally
644     marks all responses that are returned after content negotiation
645     as non-cacheable by HTTP/1.0 clients. Apache also supports the
646     HTTP/1.1 protocol features to allow caching of negotiated
647     responses.</p>
648
649     <p>For requests which come from a HTTP/1.0 compliant client
650     (either a browser or a cache), the directive <directive
651     module="mod_negotiation">CacheNegotiatedDocs</directive> can be
652     used to allow caching of responses which were subject to
653     negotiation. This directive can be given in the server config or
654     virtual host, and takes no arguments. It has no effect on requests
655     from HTTP/1.1 clients.</p>
656
657     <p>For HTTP/1.1 clients, Apache sends a <code>Vary</code> HTTP
658     response header to indicate the negotiation dimensions for the
659     response.  Caches can use this information to determine whether a
660     subsequent request can be served from the local copy.  To
661     encourage a cache to use the local copy regardless of the
662     negotiation dimensions, set the <code>force-no-vary</code> <a
663     href="env.html#special">environment variable</a>.</p>
664
665 </section>
666
667 <section id="more"><title>More Information</title>
668
669     <p>For more information about content negotiation, see Alan
670     J. Flavell's <a
671     href="http://ppewww.ph.gla.ac.uk/~flavell/www/lang-neg.html">Language
672     Negotiation Notes</a>.  But note that this document may not be
673     updated to include changes in Apache 2.0.</p>
674 </section>
675
676 </manualpage>