
Все вышеперечисленные возможности сервера настраиваются через конфигурационные файлы. Ниже приведено описание используемых для этого директив. (Описание конфигурации старых версий (PL16 и старше) вынесено в отдельный документ)
| Все директивы | |
| Объявление таблиц перекодировки: | CharsetDecl CharsetRecodeTable CharsetWideRecodeTable CharsetAlias |
| Определение клиентской кодировки: | CharsetPriority CharsetDefault CharsetByPort CharsetAgent CharsetStrictURIMatch переменная FORCE_CHARSET |
| Определение кодировки на сервере: | CharsetSourceEnc CharsetByExtension переменная FORCE_SOURCE_CHARSET |
| Автоматический редирект: | CharsetAutoRedirect CharsetNormalizeToURL CharsetNormalizeTypes CharsetRedirectFromOriginalURL CharsetNoAutoRedirectForDefaultCharset |
| Разное: | CharsetProcessType CharsetBrokenAccept CharsetBadAgent CharsetErrReject CharsetUseMultiViews CharsetRecodeHeaders CharsetDisable CharsetRecodeFilenames CharsetSoftRedirect CharsetSoftRedirectPermanent CharsetSoftRedirectTemp CharsetOverrideExpires CharsetDisableForcedExpires CharsetRecodeMethodsIn/Out CharsetRecodeMultipartForms CharsetDisableAcceptCharset |
CharsetDecl CharsetName Language [Flags]
Content-type: text/html; charset=CharsetName
CharsetDecl iso-8859-5 ru
CharsetDecl ibm866 ru
CharsetDecl windows-1251 ru
CharsetDecl koi8-r ru
CharsetDecl koi7 ru S
CharsetRecodeTable Charset1 Charset2 table_from [table_to]
CharsetRecodeTable koi8-r windows-1251 koi-win.tab win-koi.tab
CharsetRecodeTable windows-1251 koi8-r win-koi.tab koi-win.tab
Какую из них использовать - дело вкуса.
Если в конфигурации сервера указано несколько эквивалентных директив, то в работе будет использована последняя из них.
Если в конфигурации виртуального сервера есть хотя бы одна директива CharsetDecl или CharsetRecodeTable, то описания CharsetDecl/CharsetRecodeTable не наследуются от основного сервера.
CharsetWideRecodeTable CharsetFrom CharsetTo table
CharsetWideRecodeTable koi8-r koi7 conf/koi-tran.tab
Если в конфигурации сервера указано несколько эквивалентных директив, то в работе будет использована последняя из них.
В отличия от директивы CharsetRecodeTable, таблица обратной перекодировки (из CharsetTo в CharsetFrom) не строится автоматически.
CharsetAlias Oficial_Name Alias1 Alias2 Alias3 ...
CharsetAlias iso_8859-5:1988 iso-ir-144 iso_8859-5 cyrillic iso-8859-5
CharsetAlias iso_8859-5:1988 iso8859-5 iso-8859.5 iso8859.5 iso
CharsetAlias ibm866 csibm866 866 cp866 x-cp866 x-ibm866 cp-866 alt
CharsetAlias windows-1251 win x-cp1251 cp1251 cp-1251
CharsetSelectionOrder Rule1 Rule2 Rule3 ...
Portnumber - определять charset по номеру порта к которому
обратились. Соответствие кодировки и номера порта описывается
директивой CharsetByPort. Возможность
связать номер порта с кодировкой появилась начиная с версии PL20.2.
Hostname - определять charset по подстроке в hostname сервера.
Т.е. если hostname (до первой точки) сервера начинается
с имени charset
или его alias, то в качестве клиентского charset будет выбран
именно он (т.е. при обращении к хосту win-www.domain будет выбрана
кодировка с именем/алиасом win).
URIHostname - аналогично Hostname, но с именами charset сравнивается
не каноническое имя сервера, а имя, полученное в заголовке Host: от клиента
примеры использования можно посмотреть в разделе
рекомендации.
Это правило поддерживается начиная с PL26.0.
EnvVariable - предназначена для взаимодействия со
внешними модулями определения кодировки. Такие модули должны присвоить
переменной окружения FORCE_CHARSET значение имени
необходимого charset. Примеры использования совместно с mod_rewrite
есть в разделе рекомендации.
Это правило поддерживается начиная с PL26.0.
Dirprefix - определять charset по Directory prefix. Т.е.
если первая часть URI (между 1-м и 2-м '/' или между /~username/
и 3-м slash) совпадает с именем или алиасом какого-то charset,
то в качестве клиентского charset будет выбран именно этот charset.
Useragent - определять charset по HTTP-заголовку User-Agent
(см директиву CharsetAgent).
Замечания по использованию
При определении charset, в котором документ будет отдан пользователю
сначала анализируются HTTP-заголовки Accept-Charset и Accept (второй -
если эта возможность включена при компиляции сервера, см
рекомендации по установке).
Если эти заголовки присутствуют и запрошенный
charset известен (виртуальному) серверу, то документ будет отдан в
соответствии с просьбой клиента.
Если запрошенный charset серверу неизвестен и не запрашивается
"любой"
charset (Accept-Charset: *), то поведение сервера зависит от наличия
флага CharsetErrReject - если он
установлен, то сервер вернет пользователю ошибку.
Если charset не может быть определен по Accept-Charset, то сервер
делает попытку определить его в соответствии с директивой
CharsetSelectionOrder
в порядке, описанном этой директивой.
Для определения (установки) по Hostname, первые символы hostname
сервера (виртуального сервера) должны соответствовать имени или
алиасу какого-то из известных серверу
charset.
Для установки по Directory prefix, название или алиас какого-то из
charset должны совпасть с первым элементом path в URL (для запроса вида
/~username/path/to/file.html - совпасть с первым элементом пути после
~username).
Для определения клиентского charset по HTTP-заголовку User-Agent (т.е.
по WWW-броузеру у пользователя) сервер ищет в заголовке User-Agent:
одну из подстрок, указанных в директиве
CharsetAgent.
CharsetPriority Charset1 Charset2 Charset3 ...
CharsetDefault Charset_Name
CharsetDefault koi8-r
Это тот charset, который будет выдаваться клиенту, если все другие
способы определения не сработают.
CharsetByPort Charset_Name port_number
CharsetByPort koi8-r 8101
- при обращении к порту 8101 использовать кодировку koi8-r.
CharsetAgent Charset_Name Pattern1 Pattern2 Pattern3 ...
CharsetAgent windows-1251 AIR_Mosaic IWENG/1 MSIE WinMosaic (Windows (WinNT;
CharsetAgent windows-1251 (Win16; (Win95; (16-bit)
CharsetAgent koi8-r Arena Ariadna Macintosh OmniWeb Sextant PRD (X11
CharsetAgent ibm866 DosLynx
CharsetStrictURIMatch On|Off
CharsetSourceEnc Charsetname
CharsetByExtension Charsetname .ext1 .ext2 ....
CharsetProcessType mime-type
В редких случаях перекодировать нужно не только файлы с mime-type text/*, но и что-то еще. В таком случае нужно перечислить mime-type таких файлов этой директивой. В директиве можно указать как конкретный тип (например, image/jpeg), так и целый класс (image/). Отрицание (тип, который не нужно обрабатывать) задается символом ! ( !type/). Параметры обрабатываются слева направо, поэтому все исключения из общего правила должны быть левее общего правила (как в примере ниже)
Пример:
CharsetProcessType image/jpeg application/ application/php !application/ !text/plain text/
CharsetBrokenAccept Agent-Substring accept_charset_string
В случае когда в заголовке User-Agent находится подстрока Agent-Substring и заголовок Accept-Charset, полученный от клиента полностью совпадает с accept_charset_string, сервер будет игнорировать заголовок Accept-Charset полученный от клиента и будет определять кодировку по прочим признакам.
Эта директива стала необходимой с появлением Netscape Communicator 4.x - по умолчанию эта программа посылает в заголовке Accept-Charset строку "iso-8859-1,*,utf-8". В случае, когда один из сконфигурированных Charset имеет имя iso-8859-1, сервер всегда будет показывать клиенту эту кодировку, что не всегда правильно.
Пример:
CharsetBrokenAccept "Mozilla/4." "iso-8859-1,*,utf-8"
AddHandler strip-meta-http .ext1 .ext2 .....
Content-type: text/html; charset=koi8-r; level=3
Чтобы сервер не выдавал таким клиентским программам charset=...
этих клиентов нужно описать директивой CharsetBadAgent.
CharsetBadAgent Pattern1 Pattern2 Pattern3 ...
Как справедливо заметил Andrey Chernov, указывать в этой директиве только название броузера, не указывая конкретной версии - значит нарываться на неприятности в будущем. К сожалению, до версии PL14 включительно, вместе с Apache-RUS распространялся "дистрибутивный" конфигурационный файл, в котором было сделано именно так (в BadAgent указаны lynx и MSIE). Начиная с версии PL15 это упущение исправлено. Правильная (на день написания этого текста) строка выглядит так:
CharsetBadAgent arena Lynx/2.0 Lynx/2.1 Lynx/2.2 Lynx/2.3 Lynx/2.4 "MSIE 2.0;"
CharsetErrReject On|Off
При установке этого параметра в On сервер не будет выдавать документ
клиенту в случае невозможности удовлетворить запрос, полученный
в заголовках Accept/Accept-Charset, а будет сообщать клиенту об
ошибке в запросе.
При установке в Off - попытается определить charset по другим
параметрам (см директиву
CharsetSelectionOrder)
и выдаст документ как сможет.
CharsetUseMultiViews On|Off
При установке этого параметра в On (значение по умолчанию) сервер
выдает charset=... в заголовке Content-Type при соблюдении всех трех
условий:
CharsetRecodeHeaders On|Off
При установке этого параметра в On будут перекодироваться выдаваемые
сервером заголовки. По-умолчанию такой перекодировки не производится
т.к. старые версии не перекодировали и возникают серьезные
проблемы с совместимостью. Директиву нужно использовать, если в
заголовках может быть русский текст (скажем, Location: /some.cgi?Вася)
CharsetDisable On|Off
Эта директива выключает перекодировки и AutoRedirect.
При этом продолжают работать директивы CharsetSoftRedirect*
и установка переменных CHARSET_HTTP_METHOD,CHARSET_SERVER_PORT,
CHARSET_SERVER_NAME.
CharsetRecodeFilenames On|Off
При установке этого параметра в On будут перекодироваться имена файлов
в URL. По умолчанию эта перекодировка производится (для совместимости
с предыдущими версиями), однако эта перекодировка потенциально очень
вредна и "странно" работает (все директивы класса Alias,
Redirect и так далее получают неперекодированное имя, проверка прав
тоже производится для неперекодированного имени, а потом оно
перекодируется), поэтому поведение по-умолчанию может быть изменено
после переходного периода.
CharsetSoftRedirect [status] old-url new-url
Параметры:
Эта директива предназначена для замены стандартной директивы Redirect в случае использования "перекодировки по портам". Проблема стандартного Redirect заключается в том, что в качестве new-url нужно указывать URL полностью - с указанием протокола, имени сервера и порта. В то же время, при редиректах "в пределах текущего сервера" ни протокол, ни имя сервера, ни порт обычно не меняются для одного клиента, но могут быть разными для разных. CharsetSoftRedirect подставляет при редиректе текущие порт и hostname сервера.
Пример:
CharsetSoftRedirect temp /index.html /new-index.html
CharsetSoftRedirectPermanent old-url new-url
Параметры:
Директива аналогична CharsetSoftRedirect permanent old-url new-url
Пример:
CharsetSoftRedirectPermanent /index.html /new-index.html
CharsetSoftRedirectTemp old-url new-url
Параметры:
Директива аналогична CharsetSoftRedirect temp old-url new-url
Пример:
CharsetSoftRedirectTemp /index.html /new-index.html
CharsetOverrideExpires On|Off
В режиме On сервер будет заменять значение заголовка Expires своим
(обычно, 01 Jan 1970) в том случае, когда выдаваемый документ нужно
сделать некэшируемым. В режиме Off будет оставаться значение, поставленное
другими модулями или CGI-скриптом. Если никакого заголовка Expires
другими модулями не поставлено и не включена директива CharsetDisableForcedExpires On, то сервер выдаст заголовок Expires:
CharsetDisableForcedExpires On|Off
В режиме Off (умолчание) сервер будет выдавать заголовок Expires: 1 Jan 1970
для всех документов, которые должны быть сделаны некэшируемыми (т.е. тех,
в определении кодировки которых принимали участие данные, полученные от
клиента - User-Agent или Accept-Charset не совпадающий с кодировкой,
определенной по URL). Это - нормальное поведение сервера, если оно
не устраивает для сервера в целом, то разумное решение проблемы описано в
FAQ.
CharsetRecodeMethodsIn method1 [method2 [method3 [..]]]
CharsetRecodeMethodsOut method1 [method2 [method3 [..]]]
methodN - одно из ключевых слов GET, POST, PUT, ALL, NONE.Вне зависимости от того, производятся ли реальные перекодировки или нет, в запросе (CGI-скрипте) доступны переменные CHARSET - кодировка клиента и SOURCE_CHARSET - "кодировка сервера"
CharsetRecodeMultipartForms On|Off
В режиме On сервер будет перекодировать все запросы, в режиме Off -
только запросы, Content-Type которых отличается от multipart/form-data.
CharsetDisableAcceptCharset On|Off
В режиме Off (умолчание) сервер будет обрабатывать получаемый от пользователя
заголовок Accept-Charset и выдавать документы в соответствии с ним. Одновременно
выдается заголовок Vary: accept-charset, что отвечает стандарту HTTP/1.1.
В режиме On заголовок Accept-Charset не обрабатывается, Vary не выдается.
Назначение. Директива предназначена для обхода ошибки в Microsoft Internet Explorer 4.0x. Этот броузер считает некэшируемыми все документы в которых есть Vary: accept-charset (что приемлемо, но слишком жестоко - документ не должен кэшироваться если Accept-Charset сменился между запросами). Как следствие, если заполнить форму, а потом нажать Back, то форма будет перезапрошена с сервера и пользователь увидит ее пустой.
Использование CharsetDisableAcceptCharset для сервера с автоматическим выбором кодировки по броузеру клиента нарушает стандарты. Владельцы правильных броузеров (с Accept-Charset) не будут видеть правильной кодировки.
CharsetAutoRedirect charset urlprefix
charset - одна из кодировок, известных серверу.http://server/dirprefix
http://server:port/dirprefix
:port
/dirprefix
none
CharsetAutoRedirect koi8-r http://server:8100/koi8-r/ CharsetAutoRedirect windows-1251 http://server:8101 CharsetAutoRedirect iso-8859-5 :8102 CharsetAutoRedirect ibm866 /ibm866Представим, что пришел запрос на http://server2/file.html. В этом случае, в зависимости от кодировки клиента, сервер выдаст запрос на один из следующих URL:
CharsetSelectionOrder Portnumber Useragent CharsetByPort koi8-r 8101 CharsetByPort windows-1251 8100 CharsetAutoRedirect koi8-r :8100 CharsetAutoRedirect windows-1251 :8101приведет к бесконечному зацикливанию. Если порт не указан, то он сохраняется при редиректе, поэтому если подразумевается порт по-умолчанию (80), то нужно явно писать
http://server:80/.
CharsetNormalizeToURL urlprefix [minimal-size]
urlprefix - URL с которого должен начинаться канонический URL бинарного документа.
http://server/dirprefix
http://server:port/dirprefix
:port
/dirprefix
none
CharsetNormalizeToURL :80 200Данная директива заставляет сервер выдавать редирект на все запросы к бинарным (неперекодируемым) данным, размер которых больше 200 байт. Скажем, если был запрос к http://server:8100/bigimage.gif, то будет выдан редирект на http://server:80/bigimage.gif. Это нужно для того, чтобы бинарные данные не оседали в кэшах во многих экземплярах.
http://server:80/.CharsetNormalizeToURL http://images.mydomain.ruРедиректы выдаются только для MIME-types, описанных директивой CharsetNormalizeTypes.
CharsetNormalizeTypes type1/ type2/subtype type3/ !type4/subtype type4/ type5/subtype !type5/
Синтаксис и логика перечисления mime-types аналогичны директиве
CharsetProcessType.
Пример:
CharsetNormalizeTypes application/zip video/mpeg image/
CharsetRedirectFromOriginalURL On|Off
Эта директива имеет значение, если в процессе обработки запроса
сервером оригинальный был изменен на какой-либо еще (например,
через RewriteRule с флагом PT). Если флаг CharsetRedirectFromOriginalURL
имеет значение Off, то редирект, определенный директивой
CharsetAutoRedirect будет производится относительно
нового (измененного) URL, если On, то относительно оригинального (введенного пользователем)
URL.
CharsetNoAutoRedirectForDefaultCharset On|Off
Назначение этой директивы - не производить редиректа, если клиент пришел
на URL c автоматическим выбором кодировки без заголовка Accept-Charset
и с неизвестным (не описанным директивой CharsetAgent)
User-Agent. Наиболее типичный пример - поисковая система. Если эта директива
включена, то такой клиент получит требуемый документ. Если выключена -
редирект на "кэшируемый" URL с этим документом.
При необходимости явно задать кодировку хранения документа (из которой производится перекодирование), либо кодировку клиента (в которую производится перекодирование) другие модули могут использовать такие переменные окружения (в r-<subprocess_env):
Для удобства написания нетривиальных CGI-скриптов, сервер добавляет несколько дополнительных переменных окружения, доступных как для CGI, так и для модулей.
|
"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-2001 Alex Tutubalin. Design (C) 1998 Max Smolev. |
|