In the last section, we looked at multiviews as a way of providing language and image negotiation. The other way to achieve the same effects in the current release of Apache, as well as more lavish effects later (probably to negotiate browser plug-ins), is to use type maps, also known as *.var files. Multiviews works by scrambling together a plain vanilla type map; now you have the chance to set it up just as you want it. The Config file in .../site.typemap/conf/httpd1.conf is as follows:
User webuser Group webgroup ServerName www.butterthlies.com DocumentRoot /usr/www/APACHE3/site.typemap/htdocs AddHandler type-map var DirectoryIndex index.var
One should write, as seen in this file:
AddHandler type-map var
Having set that, we can sensibly say:
DirectoryIndex index.var
to set up a set of language-specific indexes.
What
this means, in plainer English, is that the
DirectoryIndex
line overrides the default index
file index.html. If you also want
index.html to be used as an alternative, you
would have to specify it — but you probably
don’t, because you are trying to do something more
elaborate here. In this case there are several versions of the
index — index.en.html,
index.it.html, and
index.ko.html — so Apache looks for
index.var for an explanation.
Look at ... /site.typemap/htdocs. We want to offer language-specific versions of the index.html file and alternatives to the generalized images bath, hen, tree, and bench, so we create two files, index.var and bench.var (we will only bother with one of the images, since the others are the same).
This is index.var :
# It seems that this URI _must_ be the filename minus the extension... URI: index; vary="language" URI: index.en.html # Seems we _must_ have the Content-type or it doesn't work... Content-type: text/html Content-language: en URI: index.it.html Content-type: text/html Content-language: it
This is bench.var :
URI: bench; vary="type" URI: bench.jpg Content-type: image/jpeg; qs=0.8 level=3 URI: bench.gif Content-type: image/gif; qs=0.5 level=1
The first line tells Apache what file is in question, here
index.* or bench.*
;
vary
tells Apache what sort of variation we have. These are the
possibilities:
type
language
charset
encoding
The name of the corresponding header, as defined in the HTTP
specification, is obtained by prefixing these names with
Content-
. These are the headers:
content-type
content-language
content-charset
content-encoding
The qs
numbers are quality
scores
, from 0 to 1. You decide what they are
and write them in. The qs
values for each type of
return are multiplied to give the overall qs
for
each variant. For instance, if a variant has a qs
of .5 for Content-type
and a qs
of .7 for Content-language
, its overall
qs
is .35. The higher the result, the better. The
level
values are also numbers, and you decide
what they are. In order for Apache to decide rationally which
possibility to return, it resolves ties in the following way:
Find the best (highest) qs
.
If there’s a tie, count the occurrences of “*” in the type and choose the one with the lowest value (i.e., the one with the least wildcarding).
If there’s still a tie, choose the type with the highest language priority.
If there’s still a tie, choose the type with the highest level number.
If there’s still a tie, choose the highest content length.
If you can predict the outcome of all this in your head, you must qualify for some pretty classy award! Following is the full list of possible directives, given in the Apache documentation:
URI:
uri
[; vary=
variations
]
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 the files were requested directly.
Content-type:
media_type
[; qs=
quality
[level=
level
]]
Often
referred to as MIME types; typical media types are
image/gif
, text/plain
, or
text/html
.
Content-language:
language
The
language of the variant, specified as an ISO 3166 standard language
code (e.g., en
for English, ko
for Korean).
Content-encoding:
encoding
If
the file is compressed or otherwise encoded, rather than containing
the actual raw data, indicates how compression was done. For
compressed files (the only case where this generally comes up),
content encoding should be x-compress
or
gzip
or deflate
, as
appropriate.
Content-length:
length
The size of the file. The size of the file is used by Apache to decide which file to send; specifying a content length in the map allows the server to compare the length without checking the actual file.
To throw this into action, start Apache with ./go
1
, set the language of your browser to Italian (in
Netscape, choose Edit → Preferences
→ Netscape → Languages), and access
http://www.butterthlies.com /. You should see
the Italian
version. MSIE seems to provide
less support for some languages, including Italian. You just get the
English version. When you look at
Catalog-summer.html, you see only the Bench
image (and that labeled as
“indirect”) because we did not
create var files for the other images.