|
Как это работаетВ этом документе описан алгоритм, по которому Apache-RUS определяет в какой кодировке документ должен быть отдан клиенту. В каком-то смысле это повторение описания директив конфигурации, но порядок изложения отвечает именно поведению сервера, при этом подробное описание директив опущено. В документе описана текущая версия (PL20). Конфигурация (в т.ч. и названия директив) старых версий (PL16 и более старых) отличается и описана в отдельном документе. В тех местах, где поведение новых и старых версий сервера отличается принциписально сделаны специальные оговорки.В дальнейшем тексте термины charset и кодировка используются практически как синонимы.
Основное назначение модуля, отвечающего за перекодировки, - произвести корректное преобразование из "charset на диске" (кодировка хранения) в "charset у клиента" (кодировка передачи) при передаче документа клиенту и произвести обратное преобразование при приеме информации от клиента (submit формы и т.п.). Все возможные способы таких преобразований должно быть описано в конфигурации сервера директивами CharsetDecl (объявление серверу о существовании кодовой таблицы) и CharsetRecodeTable (описание преобразования из одной кодировки в другую). Все имеющиеся кодировки и преобразования могут быть описаны только в конфигурации сервера/виртуального сервера. Описание директив CharsetDecl и CharsetRecodeTable в .htaccess/<Directory> не допускается по очевидной причине - такое описание требует, чтобы сервер переинициализировал таблицы перекодировки при каждом обращении к такой директории, что ведет к очень большому количеству лишних действий. Все прочие директивы Charset... могут быть указаны где угодно. Кодировка хранения (т.е. та, в которой файлы хранятся на диске) должна быть указана (возможно, отдельно для каждой директории) директивой CharsetSourceEnc (описывает все файлы в директории) или директивой CharsetByExtension. Директива CharsetByExtension имеет больший приоритет.
В случае, если в HTTP-заголовках присутствует заголовок Accept-Charset: SomeCharset или Accept: text/x-cyrillic-SomeCharset, и как минимум один из запрошенных charset известен серверу (т.е. описан в директивах CharsetDecl или CharsetAlias), то сервер выдает документ в соответствии с запрошенным charset. Если серверу известны несколько из запрошенных charset, то будет выбран имеющий наибольший приоритет. Если несколько charset в запросе имеют одинаковый наибольший приоритет, то будет выбран тот из них, который раньше описан в директиве CharsetPriority. Если при этом отсутствует и директива CharsetPriority, то результат выбора из этих charset с наибольшим приоритетом не определен. Если в заголовке Accept-Charset (Accept) указаны только charset неизвестные серверу и не указан wildcard (*), то поведение сервера зависит от флага CharsetErrReject. Если этот флаг включен (On), то клиенту вернут сообщение об ошибке. Если выключен - сервер попробует определить charset клиента по прочим параметрам.
Если заголовки AcceptCharset/Accept в запросе отсутствуют, либо по ним не удалось произвести выбор кодировки, то сервер попробует определить кодировку пользователя по трем параметрам:
Если сервер не сумел определить кодировку клиента, то документ будет отдан в кодировке, определенной директивой CharsetDefault. Если CharsetDefault не указана, то будет использован charset, описанный первым в директиве CharsetPriority.
Т.к. все директивы (кроме CharsetDecl и CharsetRecodeTable) могут быть указаны где угодно, то это позволяет хранить документы в любой смеси кодировок. Некоторые осложнения могут вызвать ServerSideIncludes. Правило простое - на файл (в том числе включаемый через SSI) действуют правила той директории, где он физически находится.
На выдачу сервером ; charset=CharsetName в заголовке
Content-Type: влияет установлена ли директива
CharsetMatchLanguage.
Если она установлена в On, то charest=... выдается при соблюдении
таких трех условий одновременно:
Такой режим удобен в том случае, если вы поддерживаете многоязыковый WWW-сервер. В самом деле, выдавать charset=koi8-r для документа на английском языке не только бессмысленно, но и вредно (например, у Lynx версий 2.5 и выше от этого едет крыша т.к. для корректной поддержки русского Lynx нужно сначала настроить). Если опция CharsetMatchLanguage выключена (Off), то charset=.... выдается для всех документов. |
|||||||||||||||||
With any suggestions or questions please feel free to contact us |