Модуль Apache mod_negotiation
| Описание: | Обеспечивает переговоры о содержании |
|---|---|
| Статус: | Базовый |
| Идентификатор модуля: | negotiation_module |
| Файл исходного кода: | mod_negotiation.c |
Краткое описание
Переговоры о содержании, или точнее, выбор содержимого, — это выбор документа, который лучше всего соответствует возможностям клиента из нескольких доступных документов. Существует две реализации этого.
- Таблица типов (файл с обработчиком
type-map) явно перечисляет файлы, содержащие варианты. - Поиск Multiviews (активируется
MultiviewsOptions), где сервер выполняет неявное соответствие шаблону имени файла и выбирает из результатов.
Таблицы типов
Таблица типов имеет формат, похожий на заголовки сообщений электронной почты 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 type-map .var
Запрос на document.html.var в этом каталоге приведет к выбору варианта, который наиболее точно соответствует предпочтениям языка, указанным в заголовке запроса пользователя Accept-Language.
Если Multiviews включен, и MultiviewsMatch установлен на «handlers» или «any», запрос на document.html обнаружит document.html.var и продолжит переговоры с явной таблицей типов.
Другие директивы конфигурации, такие как Alias, могут быть использованы для сопоставления document.html с document.html.var.
Multiviews
Поиск Multiviews активируется 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 |
| Переопределяет: | FileInfo |
| Статус: | Базовый |
| Модуль: | 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 Fallback
Оба варианта, Prefer и Fallback, могут быть указаны, поэтому либо будет предоставлен первый соответствующий вариант из LanguagePriority, если более одного варианта приемлемы, либо будет предоставлен первый доступный документ, если ни один из вариантов не соответствовал списку приемлемых языков клиента.
См. также
Директива LanguagePriority
| Описание: | Приоритет вариантов языка в случаях, когда клиент не выражает предпочтения |
|---|---|
| Синтаксис: | LanguagePriority MIME-lang [MIME-lang] ... |
| Контекст: | настройка сервера, виртуальный хост, каталог, .htaccess |
| Переопределяет: | FileInfo |
| Статус: | Базовый |
| Модуль: | mod_negotiation |
Директива LanguagePriority устанавливает приоритет вариантов языка в том случае, когда клиент не выражает предпочтения при обработке запроса Multiviews. Список MIME-lang указан в порядке убывания приоритета.
LanguagePriority en fr de
Для запроса на foo.html, где foo.html.fr и foo.html.de оба существовали, но браузер не выразил предпочтения языка, то был бы возвращён foo.html.fr.
Обратите внимание, что эта директива действует только если «лучший» язык не может быть определен другими способами, или директива ForceLanguagePriority не None. В общем случае, предпочтение языка определяет клиент, а не сервер.
См. также
© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/mod/mod_negotiation.html