| ||||||||||||||||
|
В документе описана текущая версия (PL20-PL24). Конфигурация (в т.ч. и названия директив) старых версий (PL16 и более старых) отличается и описана в отдельном документе. В тех местах, где поведение новых и старых версий сервера отличается принципиально сделаны специальные оговорки.
В дальнейшем тексте термины charset и кодировка используются практически как синонимы.
Основное назначение модуля, отвечающего за перекодировки, - произвести корректное преобразование из "charset на диске" (кодировка хранения) в "charset у клиента" (кодировка передачи) при передаче документа клиенту и произвести обратное преобразование при приеме информации от клиента (submit формы и т.п.). Все возможные способы таких преобразований должно быть описано в конфигурации сервера директивами CharsetDecl (объявление серверу о существовании кодовой таблицы) и CharsetRecodeTable (описание преобразования из одной кодировки в другую). Все имеющиеся кодировки и преобразования могут быть описаны только в конфигурации сервера/виртуального сервера. Описание директив CharsetDecl и CharsetRecodeTable в .htaccess/<Directory> не допускается по очевидной причине - такое описание требует, чтобы сервер переинициализировал таблицы перекодировки при каждом обращении к такой директории, что ведет к очень большому количеству лишних действий. Все прочие директивы Charset... могут быть указаны где угодно.
Кодировка хранения (т.е. та, в которой файлы хранятся на диске) должна быть указана (возможно, отдельно для каждой директории) директивой CharsetSourceEnc (описывает все файлы в директории) или директивой CharsetByExtension. Директива CharsetByExtension имеет больший приоритет. При необходимости определять кодировку хранения другим модулем может быть использована переменная окружения FORCE_SOURCE_CHARSET.
В случае, если в 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 клиента по прочим параметрам.
Полностью отключить распознавание кодировки клиента по заголовку Accept-Charset можно директивой CharsetDisableAcceptCharset, однако это нарушение стандарта HTTP и не может быть рекомендовано к применению. Однако существуют частные случаи, когда действие Accept-Charset нужно выключить, например Netscape Communicator 4.x настроенный по-умолчанию шлет заголовок "Accept-Charset: iso-8859-1,*,utf-8", соответственно если у вас описан Charset iso-8859-1, то пользователю с NC 4.x будет всегда показан именно iso-8859-1. Для отключения распознавания Accept-Charset в таких конкретных случаях может быть использована директива CharsetBrokenAccept.
Если заголовки AcceptCharset/Accept в запросе отсутствуют, либо по ним не удалось произвести выбор кодировки, то сервер попробует определить кодировку пользователя по трем параметрам:
Необходимая "строгость" совпадения Hostname сервера/префикса filename с именем/алиасом какой-то кодировки может быть отрегулирована директивой CharsetStrictURIMatch. В режиме "Off" (умолчание) выбор кодировки по Hostname/Directory производится сервером в случае совпадения начала имени сервера/имени директории с названием/алиасом какого-то charset. В режиме "On" производится более строгая проверка - с именем charset должны совпасть полное имя сервера или его host part (для выбора по hostname) и, соответственно, полное название директории (для выбора по имени директории).
; charset=CharsetName
в заголовке
Content-Type: влияет установлена ли директива
CharsetUseMultiViews.
Если она установлена в On, то charest=... выдается при соблюдении
таких трех условий одновременно:
"Russian Apache" includes software developed
by the Apache Group for use in the Apache HTTP server project
(http://www.apache.org/) See
Apache LICENSE. Copyright (C) 1995-2001 The Apache Group. All rights reserved. Copyright (C) 1996 Dm. Kryukov; Copyright (C) 1997-2009 |
|
|