Пункт 166. Модуль Apache mod_negotiation
Согласование содержимого или, точнее, выбор содержимого — это выбор документа, который наилучшим образом соответствует возможностям клиента, из одного из нескольких доступных документов. Есть две реализации этого.
- Карта типов (файл с обработчиком
type-map
), в которой явно перечислены файлы, содержащие варианты.
- Поиск в нескольких представлениях (включенный
Multiviews
Options
), при котором сервер выполняет неявное сопоставление с шаблоном имени файла и выбирает один из результатов.
Карты типов
Карта типов имеет формат, аналогичный почтовым заголовкам RFC822. Он содержит описания документов, разделенные пустыми строками, причем строки, начинающиеся с символа решетки ('#'), рассматриваются как комментарии. Описание документа состоит из нескольких записей заголовка; записи могут быть продолжены на несколько строк, если строки продолжения начинаются с пробелов. Начальный пробел будет удален, а строки объединены. Запись заголовка состоит из имени ключевого слова, которое всегда заканчивается двоеточием, за которым следует значение. Допускаются пробелы между именем заголовка и значением, а также между токенами значения. Допустимые заголовки:
-
Content-Encoding:
- Кодировка файла. Apache распознает только те кодировки, которые определены директивой
AddEncoding
. Обычно сюда входят кодировки x-compress
для сжатых файлов и x-gzip
для файлов, сжатых gzip. Префикс x-
игнорируется при сравнении кодировок.
-
Content-Language:
- Язык(и) варианта в качестве стандартного языкового тега Интернета (RFC 1766). Например
en
, , что означает английский язык. Если вариант содержит более одного языка, они разделяются запятой.
-
Content-Length:
- Длина файла в байтах. Если этот заголовок отсутствует, используется фактическая длина файла.
-
Content-Type:
-
Тип носителя MIME документа с необязательными параметрами. Параметры отделяются от типа носителя и друг от друга точкой с запятой с синтаксисом
name=value
. Общие параметры включают в себя:
-
level
- целое число, указывающее версию типа носителя. По
text/html
умолчанию это 2, иначе 0.
-
qs
- число с плавающей запятой со значением в диапазоне от 0 [.000] до 1 [.000], указывающее относительное «качество» этого варианта по сравнению с другими доступными вариантами, независимо от возможностей клиента. Например, файл jpeg обычно имеет более высокое исходное качество, чем файл ascii, если он пытается представить фотографию. Однако, если представляемый ресурс представляет собой искусство в формате ascii, то файл в формате ascii будет иметь более высокое качество исходного кода, чем файл в формате jpeg. Таким образом, все
qs
значения относятся к данному ресурсу.
Пример
Content-Type: image/jpeg; qs=0.8
-
URI:
- uri файла, содержащего вариант (данного типа носителя, закодированного с заданной кодировкой содержимого). Они интерпретируются как URL-адреса относительно файла карты; они должны находиться на одном сервере и должны ссылаться на файлы, к которым клиенту будет предоставлен доступ, если они будут запрошены напрямую.
-
Body:
- Фактическое содержимое ресурса может быть включено в файл карты типов с помощью заголовка Body. Этот заголовок должен содержать строку, обозначающую разделитель основного содержимого. Затем все следующие строки в файле сопоставления типов будут считаться частью тела ресурса, пока не будет найдена строка-разделитель.
Пример:
Body:----xyz----
<html>
<body>
<p>Content of the page.</p>
</body>
</html>
----xyz----
Рассмотрим, например, ресурс под названием
document.html
, который доступен на английском, французском и немецком языках. Файлы для каждого из них называются
соответственно document.html.en
, document.html.fr
, и
document.html.de
. Файл карты типов будет называться document.html.var
и будет содержать следующее:
URI: document.html
Content-language: en
Content-type: text/html
URI: document.html.en
Content-language: fr
Content-type: text/html
URI: document.html.fr
Content-language: de
Content-type: text/html
URI: document.html.de
Все эти четыре файла должны быть размещены в одном каталоге, и файл .var
должен быть связан с
type-map
обработчиком директивой AddHandler
:
Карта типов AddHandler .var
Запрос document.html.var
в этом каталоге приведет к выбору варианта, наиболее точно соответствующего языковому предпочтению, указанному в Accept-Language
заголовке запроса пользователя.
Если Multiviews
этот параметр включен и MultiviewsMatch
для него задано значение «обработчики» или «любой», запрос
document.html
обнаружит document.html.var
и продолжит согласование с явной картой типов.
Другие директивы конфигурации, например, Alias
могут использоваться для сопоставления document.html
с
document.html.var
.
Мультивиды
Поиск Multiview включен файлом Multiviews
Options
. Если сервер получает запрос /some/dir/foo
и
/some/dir/foo
не существует , то сервер читает каталог в поисках всех файлов с именем
foo.*
и эффективно подделывает карту типов, которая называет все эти файлы, назначая им те же типы мультимедиа и кодировки контента, которые он имел бы. если бы клиент спросил одного из них по имени. Затем он выбирает наилучшее соответствие требованиям клиента и возвращает этот документ.
Эта MultiviewsMatch
директива настраивает, будет ли Apache рассматривать файлы, которым не назначена метаинформация для согласования содержимого, при выборе файлов.
Директива CacheNegotiatedDocs
Описание: | Позволяет кэшировать документы с согласованным содержимым прокси-серверами. |
Синтаксис: | CacheNegotiatedDocs On|Off |
По умолчанию: | CacheNegotiatedDocs Off |
Контекст: | конфигурация сервера, виртуальный хост |
Положение дел: | База |
Модуль: | mod_negotiation |
Если установлено, эта директива разрешает кэширование документов с согласованием содержимого прокси-серверами. Это может означать, что клиенты за этими прокси-серверами могут получить версии документов, которые не соответствуют их возможностям, но это сделает кэширование более эффективным.
Эта директива применяется только к запросам, поступающим из браузеров HTTP/1.0. HTTP/1.1 обеспечивает намного лучший контроль над кэшированием согласованных документов, и эта директива не влияет на ответы на запросы HTTP/1.1.
Директива ForceLanguagePriority
Описание: | Действия, которые следует предпринять, если ни один приемлемый документ не найден |
Синтаксис: | ForceLanguagePriority None|Prefer|Fallback [Prefer|Fallback] |
По умолчанию: | ForceLanguagePriority Prefer |
Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
Переопределить: | Информация о файле |
Положение дел: | База |
Модуль: | mod_negotiation |
Директива ForceLanguagePriority
использует данный LanguagePriority
для согласования, когда сервер иначе не мог бы вернуть ни одного соответствующего документа.
ForceLanguagePriority Prefer
используется
LanguagePriority
для предоставления одного допустимого результата, а не для возврата результата HTTP 300 (НЕСКОЛЬКО ВЫБОРОВ), когда есть несколько одинаково допустимых вариантов. Accept-Language
Если были даны приведенные ниже директивы и назначен заголовок
пользователя, en
и de
каждый из них имеет качество (одинаково приемлемое), то будет обслуживаться .500
первый соответствующий вариант, . en
LanguagePriority en fr de
ForceLanguagePriority Prefer
ForceLanguagePriority Fallback
использует
LanguagePriority
для предоставления действительного результата, а не для возврата результата HTTP 406 (НЕ ПРИЕМЛЕМО). Если были даны директивы ниже, и пользователь
Accept-Language
разрешил только es
языковой ответ, но такой вариант не найден, то LanguagePriority
будет обслуживаться первый вариант из списка ниже.
LanguagePriority en fr de
Резервный вариант ForceLanguagePriority
Могут быть указаны обе опции Prefer
и Fallback
, поэтому либо первый совпадающий вариант из LanguagePriority
будет обслуживаться, если допустимо более одного варианта, либо будет обслуживаться первый доступный документ, если ни один из вариантов не соответствует допустимому списку языков клиента.
Смотрите также
Директива LanguagePriority
Описание: | Приоритет языковых вариантов для случаев, когда клиент не выражает предпочтения |
Синтаксис: | LanguagePriority MIME-lang [MIME-lang]
... |
Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
Переопределить: | Информация о файле |
Положение дел: | База |
Модуль: | mod_negotiation |
Устанавливает LanguagePriority
приоритет языковых вариантов для случая, когда клиент не выражает предпочтения при обработке запроса Multiviews. Список языков MIME расположен в порядке убывания предпочтения.
LanguagePriority en fr de
Для запроса foo.html
, где
foo.html.fr
и foo.html.de
оба существовали, но браузер не указал языковые предпочтения, foo.html.fr
будет возвращено.
Обратите внимание, что эта директива действует только в том случае, если «лучший» язык не может быть определен каким-либо другим способом или директива ForceLanguagePriority
не является None
. Как правило, предпочтение языка определяет клиент, а не сервер.
Смотрите также