Модуль Apache mod_negotiation
| Описание: | Обеспечивает согласование содержимого |
|---|---|
| Статус: | Базовый |
| Идентификатор модуля: | negotiation_module |
| Исходный файл: | mod_negotiation.c |
Краткое описание
Согласование содержимого, или, точнее, выбор содержимого, — это выбор документа, который лучше всего соответствует возможностям клиента, из нескольких доступных документов. Существует две реализации этого механизма.
- Карта типов (файл с обработчиком
type-map), в которой явно перечислены файлы с вариантами. - Поиск Multiviews (включается с помощью
MultiviewsOptions), при котором сервер неявно сопоставляет шаблон имени файла и выбирает подходящий вариант из результатов.
Карты типов
Карта типов имеет формат, похожий на формат почтовых заголовков RFC822. Она содержит описания документов, разделённые пустыми строками; строки, начинающиеся с символа решётки ('#'), считаются комментариями. Описание документа состоит из нескольких записей заголовков; записи можно продолжать на нескольких строках, если строки продолжения начинаются с пробелов. Начальный пробел удаляется, а строки объединяются. Запись заголовка состоит из имени ключевого слова, которое всегда заканчивается двоеточием, и значения. Между именем заголовка и значением, а также между элементами значения допускаются пробелы. Допустимые заголовки:
Content-Encoding:- Кодировка файла. Apache распознаёт только кодировки, заданные директивой
AddEncoding. Обычно сюда входят кодировкиx-compressдля файлов, сжатых с помощью compress, иx-gzipдля файлов, сжатых с помощью gzip. Префиксx-игнорируется при сравнении кодировок. Content-Language:- Язык или языки варианта в виде стандартного для Интернета языкового тега (RFC 1766). Например,
enозначает английский язык. Если вариант содержит более одного языка, они разделяются запятой. Content-Length:- Размер файла в байтах. Если этот заголовок отсутствует, используется фактический размер файла.
Content-Type:- Тип MIME документа, с необязательными параметрами. Параметры отделяются от типа MIME и друг от друга точкой с запятой; используется синтаксис
name=value. К распространённым параметрам относятся:level- целое число, указывающее версию типа MIME. Для
text/htmlпо умолчанию используется значение 2, в остальных случаях — 0. qs- число с плавающей точкой в диапазоне от 0[.000] до 1[.000], указывающее относительное «качество» этого варианта по сравнению с другими доступными вариантами независимо от возможностей клиента. Например, JPEG-файл обычно имеет более высокое исходное качество, чем ASCII-файл, если в нём представлена фотография. Однако если представленный ресурс — ASCII-графика, исходное качество ASCII-файла будет выше, чем JPEG-файла. Поэтому все значения
qsзависят от конкретного ресурса.
Пример
Content-Type: image/jpeg; qs=0.8
URI:- URI файла, содержащего вариант (указанного типа MIME и с указанной кодировкой содержимого). Эти 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 и продолжит согласование с явной картой типов.
Для сопоставления document.html с document.html.var можно использовать другие директивы конфигурации, например Alias.
Multiviews
Поиск Multiviews включается с помощью директивы Multiviews Options. Если сервер получает запрос к /some/dir/foo, а /some/dir/foo не существует, сервер просматривает каталог в поисках всех файлов с именем foo.* и фактически формирует карту типов, перечисляющую все найденные файлы и назначающую им те же типы MIME и кодировки содержимого, которые были бы назначены, если бы клиент запросил один из этих файлов по имени. Затем сервер выбирает вариант, лучше всего соответствующий требованиям клиента, и возвращает этот документ.
Директива 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 (MULTIPLE CHOICES), когда имеется несколько равнозначных вариантов. Если заданы приведённые ниже директивы, а заголовок Accept-Language пользователя присваивает en и de одинаковое качество .500 (то есть они одинаково допустимы), будет выдан первый подходящий вариант — en.
LanguagePriority en fr de ForceLanguagePriority Prefer
ForceLanguagePriority Fallback использует LanguagePriority для выдачи допустимого результата вместо ответа HTTP 406 (NOT ACCEPTABLE). Если заданы приведённые ниже директивы, а заголовок 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