Russian Apache Switch to English Поисковая система
Яndex.Site
Switch to Russian koi8-r
windows=1251
cp-866
iso8859-5
Russian Apache Как это работает Рекоммендации Где взять Как установить Как настроить Статус и поддержка
Краткий обзор FAQ Список рассылки Благодарности Поиск по серверу Powered by Russian Apache
(c) 1995-99 Apache Group
(c) 1996 Dm. Kryukov
(c) 1997-99 Alex Tutubalin
Design (c) 1998 Max Smolev
Как это работает
В этом документе описан алгоритм, по которому Apache-RUS определяет в какой кодировке документ должен быть отдан клиенту. В каком-то смысле это повторение описания директив конфигурации, но порядок изложения отвечает именно поведению сервера, при этом подробное описание директив опущено. В документе описана текущая версия (PL20-PL24). Конфигурация (в т.ч. и названия директив) старых версий (PL16 и более старых) отличается и описана в отдельном документе. В тех местах, где поведение новых и старых версий сервера отличается принципиально сделаны специальные оговорки.

В дальнейшем тексте термины charset и кодировка используются практически как синонимы.

Предварительные замечания

Основное назначение модуля, отвечающего за перекодировки, - произвести корректное преобразование из "charset на диске" (кодировка хранения) в "charset у клиента" (кодировка передачи) при передаче документа клиенту и произвести обратное преобразование при приеме информации от клиента (submit формы и т.п.). Все возможные способы таких преобразований должно быть описано в конфигурации сервера директивами CharsetDecl (объявление серверу о существовании кодовой таблицы) и CharsetRecodeTable (описание преобразования из одной кодировки в другую). Все имеющиеся кодировки и преобразования могут быть описаны только в конфигурации сервера/виртуального сервера. Описание директив CharsetDecl и CharsetRecodeTable в .htaccess/<Directory> не допускается по очевидной причине - такое описание требует, чтобы сервер переинициализировал таблицы перекодировки при каждом обращении к такой директории, что ведет к очень большому количеству лишних действий. Все прочие директивы Charset... могут быть указаны где угодно.

Кодировка хранения (т.е. та, в которой файлы хранятся на диске) должна быть указана (возможно, отдельно для каждой директории) директивой CharsetSourceEnc (описывает все файлы в директории) или директивой CharsetByExtension. Директива CharsetByExtension имеет больший приоритет.

Определение кодировки клиента по Accept-Charset:/Accept

В случае, если в 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 невозможно - это нарушало бы стандарт 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 в запросе отсутствуют, либо по ним не удалось произвести выбор кодировки, то сервер попробует определить кодировку пользователя по трем параметрам: Порядок срабатывания этих способов определяется директивой CharsetSelectionOrder (В версиях до PL16 можно было менять местами только порядок срабатывания Directory Prefix/UserAgent и выключать (по отдельности) Hostname prefix и Directory Prefix).

Необходимая "строгость" совпадения Hostname сервера/префикса filename с именем/алиасом какой-то кодировки может быть отрегулирована директивой CharsetStrictURIMatch. В режиме "Off" (умолчание) выбор кодировки по Hostname/Directory производится сервером в случае совпадения начала имени сервера/имени директории с названием/алиасом какого-то charset. В режиме "On" производится более строгая проверка - с именем charset должны совпасть полное имя сервера или его host part (для выбора по hostname) и, соответственно, полное название директории (для выбора по имени директории).

Если у сервера ничего не получилось

Если сервер не сумел определить кодировку клиента, то документ будет отдан в кодировке, определенной директивой CharsetDefault. Если CharsetDefault не указана, то будет использован charset, описанный первым в директиве CharsetPriority, а если нет и этой директивы, то charset, описанный первой директивой CharsetDecl.

SSI

Т.к. все директивы (кроме CharsetDecl и CharsetRecodeTable) могут быть указаны где угодно, то это позволяет хранить документы в любой смеси кодировок. Некоторые осложнения могут вызвать ServerSideIncludes. Правило простое - на файл (в том числе включаемый через SSI) действуют правила той директории, где он физически находится.

HTTP-заголовок Content-Type: text/html; charset=...

На выдачу сервером ; charset=CharsetName в заголовке Content-Type: влияет установлена ли директива CharsetUseMultiViews. Если она установлена в On, то charest=... выдается при соблюдении таких трех условий одновременно:
  1. Броузер клиента не является "Bad Agent"
  2. Опция MultiViews (поддержка многоязыковой выдачи) включена (On)
  3. Язык документа, описанный через директиву AddLanguage, совпадает с языком Charset, описанным директивой CharsetDecl.
Если опция CharsetUseMultiViews выключена (Off), то charset=.... выдается для всех документов.


[Russian Apache] [Как это работает] [Рекомендации] [Где взять] [Как установить] [Как настроить] [Статус и поддержка]
[Краткий обзор] [FAQ] [Список рассылки] [Благодарности] [Поиск] [Russian Apache Logo]
Cyrillic encoding: [ auto ] [ koi8-r ] [ windows ] [ cp-866 ] [ iso ]

"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-99 The Apache Group. All rights reserved.
Copyright (C) 1996 Dm. Kryukov; Copyright (C) 1997-99 Alex Tutubalin.
Design (C) 1998 Max Smolev.