<-
Apache > HTTP Server > Documentation > Version 2.0

Довольные Переговоры

Apacheские поддержки удовлетворяют переговоры как описано в спецификации HTTP/1.1. Это может выбрать лучшее представление ресурса, основанного на поставляемом браузером предпочтении виду средств рекламы, языкам, набору символов и зашифровыванию. Это также осуществляет несколько особенностей, чтобы дать более интеллектуальную обработку запросов от браузеров, которые посылают неполную информацию переговоров.

довольные переговоры обеспечиваются mod_negotiation модуль, который собран в по умолчанию.

top

About Content Negotiation

ресурс может быть доступным в нескольких различных представлениях. Например, это могло бы быть доступно на различных языках или различных видах средств рекламы, или комбинации. Один способ выбирать самый соответствующий выбор состоит в том, чтобы дать пользователю страницу индекса, и позволить им выбирать. Однако это часто возможно для сервера выбрать автоматически. Это работает, потому что браузеры могут послать, как часть каждого запроса, информация о том, какие представления они предпочитают. Например, браузер мог указать, что это хотело бы видеть информацию на французском языке, если возможно, еще английский язык сделает. Браузеры указывают их предпочтение ударами головой в запросе. Чтобы просить только французские представления, браузер послал бы

Accept-Language: fr

отметить, что это предпочтение будет только применено, когда есть выбор представлений, и они изменяются языком.

как пример более сложного запроса, этот браузер формировался, чтобы принять французский и английский язык, но предпочесть французский язык, и принимать различные виды средств рекламы, предпочитая HTML по простому тексту или другим типам текста, и предпочитая ДЖИФА или JPEG по другим видам средств рекламы, но также и позволяя любой другой вид средств рекламы как последнее прибежище:

Accept-Language: fr; q=1.0, en; q=0.5
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

Apache поддерживает 'сервер, который везут' довольные переговоры, как определено в спецификации HTTP/1.1. Это полностью поддерживает Accept , Accept-Language , Accept-Charset и Accept-Encoding удары головой запроса. Апач также поддерживает 'прозрачные' довольные переговоры, которые являются экспериментальным протоколом переговоров, определенным в RFC 2295 и RFC 2296. Это не предлагает поддержку 'переговорам особенности' как определено в этих RFCs.

A ресурс является концептуальным юридическим лицом, идентифицированным ТУРАМИ (RFC 2396). Сервер HTTP как Apache обеспечивает доступ к представления из ресурса (ов) в пределах его namespace, с каждым представлением в форме последовательности байтов с определенным видом средств рекламы, набором символов, зашифровыванием, и т.д. Каждый ресурс может быть связан с нолем, один, или больше чем одним представлением в любое данное время. Если многократные представления доступны, ресурс упоминается договорный и каждое из его представлений называют a вариант . пути, по которым изменяются варианты для договорного ресурса, называют измерения из переговоров.

top

Negotiation in Apache

чтобы договариваться о ресурсе, серверу нужно дать информацию о каждом из вариантов. Это сделано в одном из двух путей:

Using a type-map file

карта типа - документ, который связан с названным тренером type-map (или, для назад-совместимости со старшими Apacheскими конфигурациями, типом MIME application/x-type-map ). Отметьте, что, чтобы использовать эту особенность, Вы должны установить тренера в конфигурации, которая определяет суффикс файла как type-map ; это лучше всего сделано с

AddHandler type-map .var

в файле конфигурации сервера.

файлы карты типа должны иметь то же самое название как ресурс, который они описывают, и имеют вход для каждого доступного варианта; эти записи состоят из смежных линий удара головой HTTP-формата. Записи для различных вариантов отделены чистыми линиями. Чистые линии незаконны в пределах входа. Обычно начать файл карты со входа для объединенного юридического лица в целом (хотя это не требуется, и если подарок будет игнорироваться). Файл карты примера показывают ниже. Этот файл назвали бы foo.var , поскольку это описывает названный ресурс foo .

URI: foo

URI: foo.en.html
Content-type: text/html
Content-language: en

URI: foo.fr.de.html
Content-type: text/html;charset=iso-8859-2
Content-language: fr, de

отметить также, что typemap файл будет иметь приоритет по расширению имени файла, даже когда Мультипредставления идут. Если варианты имеют различные исходные качества, которые могут быть обозначены "qs" параметром к виду средств рекламы, как на этой картине (доступный как JPEG, ДЖИФ, или искусство ASCII):

URI: foo

URI: foo.jpeg
Content-type: image/jpeg; qs=0.8

URI: foo.gif
Content-type: image/gif; qs=0.5

URI: foo.txt
Content-type: text/plain; qs=0.01

ценности qs могут измениться по диапазону 0.000 к 1.000. Отметьте, что любой вариант с ценностью qs 0.000 никогда не будет выбираться. Вариантам без 'qs' ценности параметра дают qs фактор 1.0. qs параметр указывает относительное 'качество' этого варианта по сравнению с другими доступными вариантами, независимыми от способностей клиента. Например, файл JPEG имеет обычно более высокое исходное качество чем файл ASCII, если это пытается представить фотографию. Однако, если бы представляемый ресурс - оригинальное искусство ASCII, то представление ASCII имело бы более высокое исходное качество чем представление JPEG. Ценность qs является поэтому определенной для данного варианта в зависимости от природы ресурса, который это представляет.

полный список признанных ударов головой доступен в mod_negotation typemap документация.

Multiviews

MultiViews является в-справочник выбором, означая, что это может быть установлено с Options директива в пределах a <Directory> , <Location> или <Files> секция в httpd.conf , или (если AllowOverride должным образом установлен) в .htaccess файлы. Отметьте это Options All не устанавливает MultiViews ; Вы должны спросить это по имени.

эффект MultiViews следующие: если сервер получает запрос о /some/dir/foo , если /some/dir имеет MultiViews позволенный, и /some/dir/foo делает нет существовать, тогда сервер читает справочник, ищущий файлы, названные foo. *, и эффективно фальсифицирует карту типа, которая называет все те файлы, назначая их теми же самыми видами средств рекламы и довольными зашифровываниями, которые это имело бы, если клиент спросил одного из них по имени. Это тогда выбирает лучшее состязание к требованиям клиента.

MultiViews может также обратиться к поискам файла, названного DirectoryIndex директива, если сервер пробует внести справочник в указатель. Если файлы конфигурации определяют

DirectoryIndex index

тогда сервер вынесет решение между index.html и index.html3 если оба присутствуют. Если ни один не присутствует, и index.cgi есть ли, сервер будет управлять этим.

если один из файлов нашел, читая справочник не признавали расширение mod_mime чтобы определять его Charset, Довольный тип, Язык, или Зашифровывание, тогда результат зависит от урегулирования MultiViewsMatch директива. Эта директива определяет, могут ли тренеры, фильтры, и другие типы расширения участвовать на переговорах Мультипредставлений.

top

The Negotiation Methods

после того, как Apache получил список вариантов для данного ресурса, или от файла карты типа или от имен файла в справочнике, это призывает один из двух методов, чтобы выбрать 'лучший' вариант, чтобы возвратиться, если любой. Не необходимо знать любые из деталей того, как переговоры фактически имеют место, чтобы использовать довольные особенности переговоров Апача. Однако остальная часть этого документа объясняет методы, используемые для заинтересованных.

есть два метода переговоров:

  1. сервер, который везут переговорами с Apacheским алгоритмом используется в нормальном случае. Апачский алгоритм объясняется более подробно ниже. Когда этот алгоритм используется, Apache может иногда 'играть' качественный фактор специфического измерения, чтобы достигнуть лучшего результата. Путем Apache может играть, качественные факторы объясняются более подробно ниже.
  2. прозрачные довольные переговоры используется, когда браузер определенно просит это через механизм, определенный в RFC 2295. Этот метод переговоров дает браузеру полный контроль над выбиранием 'лучшего' варианта, результат поэтому зависит от определенных алгоритмов, используемых браузером. Как часть прозрачного процесса переговоров, браузер может попросить, чтобы Apache управлял 'отдаленным различным алгоритмом выбора' определенный в RFC 2296.

Dimensions of Negotiation

измерение примечания
Вид средств рекламы браузер указывает предпочтение с Accept область удара головой. Каждый пункт может иметь связанный качественный фактор. Различное описание может также иметь качественный фактор ("qs" параметр).
язык браузер указывает предпочтение с Accept-Language область удара головой. Каждый пункт может иметь качественный фактор. Варианты не могут быть связаны ни с одним, одним или больше чем одним языком.
зашифровывание браузер указывает предпочтение с Accept-Encoding область удара головой. Каждый пункт может иметь качественный фактор.
Charset браузер указывает предпочтение с Accept-Charset область удара головой. Каждый пункт может иметь качественный фактор. Варианты могут указать charset как параметр вида средств рекламы.

Apache Negotiation Algorithm

Apache может использовать следующий алгоритм, чтобы выбрать 'лучший' вариант (если любой), чтобы возвратиться к браузеру. Этот алгоритм не далее конфигурируем. Это работает следующим образом:

  1. сначала, для каждого измерения переговоров, проверьте соответствующее Accept* область удара головой и назначает качество на каждый вариант. Если Accept* удар головой для любого измерения подразумевает, что этот вариант не приемлем, устраните это. Если никакие варианты не остаются, пойдите, чтобы ступить 4.
  2. выбрать 'лучший' вариант процессом устранения. Каждый из следующих тестов применен чтобы. Любые варианты, не отобранные при каждом тесте устранены. После каждого теста, если только один вариант остается, выберите это как лучшее состязание и продолжают ступать 3. Если больше чем один вариант остается, движение к следующему тесту.
    1. умножить качественный фактор от Accept удар головой с фактором качества-источника для этого вида средств рекламы вариантов, и выбора варианты с самой высокой ценностью.
    2. выбрать варианты с самым высоким языковым фактором качества.
    3. выбрать варианты с лучшим языковым состязанием, используя любой заказ языков в Accept-Language удар головой (если подарок), или иначе заказ языков в LanguagePriority директива (если подарок).
    4. выбрать варианты с самым высоким параметром СМИ 'уровня' (имел обыкновение давать версию видов средств рекламы текста/HTML).
    5. выбрать варианты с лучшими charset параметрами СМИ, как дано на Accept-Charset линия удара головой. Charset ISO-8859-1 приемлем если явно не исключено. Варианты с a text/* вид средств рекламы, но не явно связанный со специфическим charset, как предполагают, находится в ISO-8859-1.
    6. выбрать те варианты, которые связали charset параметры СМИ, которые нет ISO-8859-1. Если нет таких вариантов, выберите все варианты вместо этого.
    7. выбрать варианты с лучшим зашифровыванием. Если есть варианты с зашифровыванием, которое является приемлемым для пользовательского агента, выбирать только эти варианты. Иначе, если есть соединение закодированных и незакодированных вариантов, выберите только незакодированные варианты. Если или все варианты закодированы, или все варианты не закодированы, выбирают все варианты.
    8. выбрать варианты с наименьшей довольной длиной.
    9. выбрать первый вариант тех, которые остаются. Это будет или первым, перечисленным в файле карты типа, или когда варианты прочитаны от справочника, тот, название файла которого прибывает сначала когда сортировано используя заказ кодекса ASCII.
  3. алгоритм теперь выбрал один 'лучший' вариант, так возвратите это как ответ. Удар головой ответа HTTP Vary собирается указать измерения переговоров (браузеры, и тайники могут использовать эту информацию, пряча про запас ресурс). Конец.
  4. чтобы получить здесь средства, никакой вариант не был отобран (потому что ни один не приемлем для браузера). Возвратите 406 статусов (значение "Никакое приемлемое представление") с телом ответа, состоящим из документа HTML, перечисляющего доступные варианты. Также установите HTTP Vary удар головой, чтобы указать измерения разницы.
top

Fiddling with Quality Values

Apache иногда изменяет качественные ценности от того, что ожидалось бы строгой интерпретацией Apacheского алгоритма переговоров выше. Это должно получить лучшее следствие алгоритма для браузеров, которые не посылают полную или точную информацию. Некоторые из самых популярных браузеров посылают Accept информация удара головой, которая иначе привела бы к выбору неправильного варианта во многих случаях. Если браузер пошлет полную и правильную информацию, то эти скрипки не будут применены.

Media Types and Wildcards

Accept: удар головой запроса указывает предпочтение видам средств рекламы. Это может также включить виды средств рекламы 'группового символа', типа "изображения / *" или "*/*", где * соответствует любой веренице. Так запрос, включая:

Accept: image/*, */*

указал бы, что любой тип, начинающий "изображение/" является приемлемым, как - любой другой тип. Некоторые браузеры обычно посылают групповые символы в дополнение к явным типам, с которыми они могут обращаться. Например:

Accept: text/html, text/plain, image/gif, image/jpeg, */*

намерение этого состоит в том, чтобы указать, что явно перечисленные типы предпочтены, но если различное представление доступно, который в порядке также. Используя явные качественные ценности, то, что действительно хочет браузер, - кое-что как:

Accept: text/html, text/plain, image/gif, image/jpeg, */*; q=0.01

явные типы не имеют никакого качественного фактора, таким образом они неплатеж к предпочтению 1.0 (самое высокое). Групповому символу */* дают низкое предпочтение 0.01, таким образом другие типы будут только возвращены, если никакой вариант не будет соответствовать явно перечисленному типу.

если Accept: удар головой содержит нет q факторы вообще, Apache заставляет ценность q "*/*", если подарок, к 0.01 подражать желательному поведению. Это также устанавливает ценность q групповых символов формата, "печатают / *" к 0.02 (таким образом они предпочтены по спичкам против "*/*". Если любой вид средств рекламы на Accept: удар головой содержит q фактор, эти специальные ценности нет прикладной, так просит от браузеров, которые посылают явную информацию, чтобы начаться с работы как ожидается.

Language Negotiation Exceptions

новый в Apacheе 2.0, некоторые исключения были добавлены к алгоритму переговоров, чтобы позволить изящное отступление, когда языковые переговоры не в состоянии найти состязание.

когда клиент просит страницу на вашем сервере, но сервер не может найти единственную страницу, которая соответствует Accept-language посланный браузером, сервер не возвратит или "Никакие Приемлемые Различные" или "Многократные Выборы" ответ клиенту. Чтобы избегать этих ошибочных сообщений, возможно формировать Apacheа, чтобы игнорировать Accept-language в этих случаях и обеспечивают документ, который явно не соответствует запросу клиента. ForceLanguagePriority директива может использоваться, чтобы отвергнуть один или оба из этих ошибочных сообщений и заменить суждением серверов в форме LanguagePriority директива.

сервер также попытается соответствовать подмножествам языка, когда никакое другое состязание не может быть найдено. Например, если клиент просит документы с языком en-GB для британского варианта английского языка, сервер обычно не позволяется по стандарту HTTP/1.1 соответствовать этому против документа, который отмечен как просто en . (отметьте, что это - почти конечно ошибка конфигурации включить en-GB и нет en в Accept-Language удар головой, так как очень маловероятно, что читатель понимает британский вариант английского языка, но не понимает английский язык вообще. К сожалению, много текущих клиентов имеют конфигурации по умолчанию, которые напоминают это.) Однако, если никакое другое языковое состязание не возможно и сервер собирается не возвращать "Никакие Приемлемые Варианты" ошибка или отступление к LanguagePriority , сервер будет игнорировать спецификацию подмножества и состязание en-GB против en документы. Неявно, Apache добавит родительский язык к приемлемому языковому списку клиента с очень низкой качественной ценностью. Но примечание, что, если клиент просит "В-ГИГАБИТ; q=0.9, франк; q=0.8", и сервер определяли документы "в" и "франк", тогда документ "франка", будет возвращен. Это необходимо поддержать согласие со спецификацией HTTP/1.1 и работать эффективно с должным образом формируемыми клиентами.

чтобы поддерживать передовые методы (, типа печенья или специальных ДОРОЖЕК URL), чтобы определить привилегированный язык пользователя, начиная с Apacheа 2.0.47 mod_negotiation признает environment variable prefer-language . если это существует и содержит соответствующий языковой признак, mod_negotiation будет пробовать выбрать соответствующий вариант. Если нет такого варианта, нормальный процесс переговоров применяется.

Example

SetEnvIf Cookie "language=en" prefer-language=en
SetEnvIf Cookie "language=fr" prefer-language=fr

top

Extensions to Transparent Content Negotiation

Apache расширяет прозрачный довольный протокол переговоров (RFC 2295) следующим образом. Новое {encoding ..} элемент используется в различных списках, чтобы маркировать варианты, которые являются доступными с определенным довольным зашифровыванием только. Выполнение алгоритма RVSA/1.0 (RFC 2296) расширено, чтобы признать закодированные варианты в списке, и использовать их как варианты кандидата всякий раз, когда их зашифровывания приемлемы согласно Accept-Encoding удар головой запроса. Выполнение RVSA/1.0 не делает круглые вычисленные качественные факторы к 5 десятичным местам перед выбором лучшего варианта.

top

Note on hyperlinks and naming conventions

если Вы используете языковые переговоры, Вы можете выбрать между различными соглашениями обозначения, потому что файлы могут иметь больше чем одно расширение, и заказ расширений является обычно несоответствующим (см. mod_mime документация для деталей).

типичный файл имеет расширение ТИПА ПАНТОМИМЫ ( например. , html ), возможно расширение зашифровывания ( например. , gz ), и конечно языковое расширение ( например. , en ), когда мы имеем различные языковые варианты этого файла.

примеры:

здесь еще некоторые примеры имен файла вместе с действительным и недействительным осуществляют гиперссылку:

имя файла действительная гиперссылка недействительная гиперссылка
foo.html.en foo
foo.html
-
foo.en.html foo foo.html
foo.html.en.gz foo
foo.html
foo.gz
foo.html.gz
foo.en.html.gz foo foo.html
foo.html.gz
foo.gz
foo.gz.html.en foo
foo.gz
foo.gz.html
foo.html
foo.html.gz.en foo
foo.html
foo.html.gz
foo.gz

Cмотря на стол выше, Вы заметите, что всегда возможно использовать название без любых расширений в гиперссылке ( например. , foo ). Преимущество состоит в том, что Вы можете скрыть фактический тип документа rsp. файл и можете изменить это позже, например. , от html к shtml или cgi не изменяя никаких ссылок гиперссылки.

если Вы хотите продолжить использовать ТИП ПАНТОМИМЫ в вашем, осуществляет гиперссылку ( например. foo.html ) языковое расширение (включая расширение зашифровывания, если есть один) должно быть справа расширения ТИПА ПАНТОМИМЫ ( например. , foo.html.en ).

top

Note on Caching

когда тайник хранит представление, это связывает это с URL запроса. Следующий раз, когда URL требуют, тайник, может использовать сохраненное представление. Но, если ресурс является договорным в сервере, это могло бы привести только к первому требуемому припрятавшему про запас варианту, и последующие хиты тайника могли бы возвратить неправильный ответ. Чтобы предотвращать это, Apache обычно отмечает все ответы, которые возвращены после довольных переговоров как non-cacheable клиентами HTTP/1.0. Апач также поддерживает особенности протокола HTTP/1.1, чтобы позволить прятать про запас из договорных ответов.

для запросов, которые прибывают от послушного клиента HTTP/1.0 (или браузер или тайник), директива CacheNegotiatedDocs может использоваться, чтобы позволить прятать про запас из ответов, которые были подчинены переговорам. Эту директиву можно дать в сервере config или действительном хозяине, и не берет никаких аргументов. Это не имеет никакого эффекта на запросы от клиентов HTTP/1.1.

top

More Information

за дополнительной информацией о довольных переговорах, см. Алана Дж. Флейвлл Language Negotiation Notes . но примечание, что этот документ не может быть обновлен, чтобы включить изменения в Apacheе 2.0.