MultiCharset Htmls Module

for Apache WWW server

Версия 1.2

Copyright (C) 1997, Alex Tutubalin


Предуведомление

ВНИМАТЕЛЬНО прочитайте документацию (этот документ). Конфигурация (синтаксис директив) и поведение модуля СИЛЬНО ИЗМЕНИЛИСЬ с версии 1.1, старая конфигурация не будет работать.

Что это такое

Это модуль к Apache http server, который позволяет хранить на диске документы (HTML'и) в разных кодировках (koi8, cp1251 etc) и "прозрачно" перекодировать их в нужные моменты времени во "внутреннее представление" сервера. При этом, вне зависимости от "кодировки хранения", все документы для пользователя будут выглядеть совершенно одинаково.
Модуль рассчитан на использование совместно с любой версией Apache, начиная с 1.1, хотя пока тестировалась только работа с 1.1.3.
Рекомендуется использование совместно с Russian Apache, что позволит не только хранить документы на диске в разных кодировках, но и показывать их клиенту в соответствии с его предпочтениями. При этом mod_mc_html оформлен независимо от Russian Apache и (теоретически) должен работать и с любой другой корректной русификацией этого сервера (т.е. такой, при которой "русифицируются" не только показ html/shtml, но и результаты работы любого модуля).

Статус и поддержка

Этот модуль - freeware для некоммерческого и/или нетиражируемого использования. Т.е. ставить его на коммерческий WWW-сервер можно никого не спрашивая (это наиболее часто задаваемый вопрос, поэтому я его обговариваю сразу).

В случае распространения модуля в составе какого-то тиражируемого программного продукта и/или пакета услуг (скажем, услуги по "установке программного обеспечения WWW-сервера"), необходимо связаться со мной и обговорить условия такого распространения.

При модификации необходимо сохранить упоминание о моем авторстве.

Модуль написан прежде всего для того, чтобы минимизировать поток приходящей ко мне электронной почты (я получил уже безумное количество вопросов "как хранить документы в нескольких кодировках"), никакой поддержки я никому не обещаю. Впрочем, если есть желающие за такую поддержку заплатить - это совсем другой разговор :).

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

Где это взять

Текущая официальная версия будет помещаться на сервер ftp://ftp.lexa.ru. В той же директории могут лежать предшествующие и бета-версии

Как это собрать

mod_mc_htmls - обычный модуль Apache. Чтобы его собрать, нужно скопировать mod_mc_htmls.c в директорию, где лежат исходные тексты Apache, добавить строчку
Module mc_htmls_module     mod_mc_htmls.o
в файл Configuration и запустить ./Configure; make после чего получится файл httpd, который и является www-сервером.

Внимание! Для использования этого модуля, Apache должен быть собран с mime_module. Я не вижу причин, по которым mime_module хотелось бы выкинуть, это так, предупреждение на всякий случай.

Как сконфигурировать сервер

Для конфигурации модуля используются следующие директивы:
FileCharset <name> <tablefile>
Default: никаких FileCharset
Context: server, virtual host
Использование: Описание правила перекодировки файла во внутреннюю кодировку сервера. Если описано несколько FileCharset с одинаковым именем, то будет использоваться более раннее описание.
Пример: описывает charset с именем cp1251 и перекодировкой во "внутреннее" представление по таблице $SERVER_ROOT/conf/win-koi.tab.

UseFileCharset <name> extension1 extension2
Default: никакого
Context: конфигурация сервера, virtual host, <Directory>, .htaccess.
Использование: связывает правило перекодировки с расширением файла. В случае, когда одно расширение использовано в нескольких директивах с разными UseFileCharset на одном уровне видимости, то сработает более позднее описание. Порядок приоритета для описания на разных уровнях видомости обычный для Apache (см. документацию на Apache) - наибольший приоритет у .htaccess (если разрешено AllowOverride), наименьший - у server-wide конфигурации.
Пример
UseFileCharset koi8 .html .htm
UseFileCharset cp1251 .htmw .h1251
<Directory /some/where>
UseFileCharset cp1251 .html
</Directory>
- использовать для файлов .html и .htm таблицу, описанную в FileCharset koi8, а для .htmlw и .h1251 - описанную в FileCharset cp1251. В директории /some/where для файлов .html будет использована таблица cp1251.

DefaultFileCharset <name>
Default: никакого
Context: конфигурация сервера, virtual host, <Directory>, .htaccess.
Использование: Директива указывает серверу, какой FileCharset использовать для перекодировки файлов в случае, когда расширение файла не описано в UseFileCharset. В случае, когда DefaultFileCharset не задан и файл не описывается UseFileCharset, поведение сервера отличается для двух различных ситуаций: Зарезервированное имя none отменяет DefaultFileCharset, унаследованный от директории верхнего уровня или глобальной конфигурации сервера. Прочий порядок наследования - обычный для Apache.
Пример:
DefaultFileCharset koi8
<Directory /some/where>
AllowOverride FileInfo
DefaultFileCharset cp1251
</Directory>
<Directory /another/place>
DefaultFileCharset none
</Directory>
- использовать DefaultCharset с именем koi8 для всего сервера, кроме директории /some/where, где использовать cp1251 и директории /another/place, для которой (и ее поддиректорий, если в них не указано иначе) отменить DefaultCharset совсем.

RecodeAllFiles on|off
Default: off
Контекст: конфигурация сервера, виртуального сервера, directory, .htaccess.
Использование: Включение этой опции указывает серверу, что перекодировку нужно производить для всех файлов с Content-Type: text/html. При этом, для расширений файлов, описанных в директиве UseFileCharset перекодировка производится в соответствии с этой директивой, а для всех прочих - в соответствии с директивой DefaultFileCharset. Если DefaultFileCharset не установлена, то перекодировка не производится, а управление передается дальше по цепочке handler'ов для типа text/html.
ВНИМАНИЕ! У сервера может быть установлено несколько обработчиков типа text/html. Например, директива XBitHack включает обработку файлов с установленным executable bit как server-parsed (SHTML) документов. Порядок вызова обработчиков зависит от порядка их описания в файле Configuration сервера. Вследствие этого, при наличии более одного обработчика для text/html можно получить конфигурацию, которая ведет себя достаточно странно. Например, mod_mc_htmls в включенной опцией RecodeAllFiles может "отбирать" документы (или часть документов) от XBitHack, а может получиться и наоборот. Никакой сложности тут нет, просто нужно понимать что вы делаете :)

Если опция RecodeAllFiles выключена, то перекодировка производится только для документов, для которых установлен server-recoded handler. См описание использования команд mime_module ниже в этом документе.

StripHttpEquivs on|off
Default: off
Контекст: конфигурация сервера, виртуального сервера, directory, .htaccess.
Использование: Разрешает или запрещает удаление строчек <meta http-equiv ....> из заголовка документа. Эта директива введена для борьбы с очевидным противоречием - ряд HTML-редакторов ставит через HTTP-equiv Content-Type документов, в результате чего в HTTP-заголовках и в самом документе Content-Type может оказаться несогласованным. Это несогласование приводит к неприятным последствиям. Во-первых, ряд броузеров ошибочно предпочитают HTTP-Equiv HTTP-заголовкам, что неправильно. Во-вторых, если документ берется из локального кэша броузера, то http-заголовков он уже не содержит и броузер берет информацию о Content-Type из <META>.
Простейшим способом убрать это противоречие оказалось удаление всех <META HTTP-EQUIV из документа. Лучше, конечно, удалять его прямо в файле, но не все авторы HTML-документов на это способны. Для неспособных предназначена директива StripHttpEquivs. Эта директива работает только если документ обрабатывается данным модулем. Т.е. если включен режим RecodeAllFiles+DefaultFileCharset или расширение документа описано в директиве UseFileCharset.
Для того, чтобы вышеописанные команды работали в .htaccess, для директории должно быть включено AllowOverride FileInfo.

Использование команд mime_module для управления перекодировками

Поставляемый с Apache mime_module поддерживает ряд директив, которые могут оказаться полезными при использовании совместно с MultiCharset Htmls Module.

AddType mimetype/sybtype extension extension
Это команда mime_module, которая используется для указания MIME-type файла с нестандартным расширением. Команда может быть использована как на server-wide уровне, так и для директорий, для которых разрешен Override FileInfo.
Пример: - воспринимать файлы с расширением .htm8, .htm1251, .htmlw как имеющие тип text/html (т.е. так же как и *.html). Это нужно делать по двум причинам. Во-первых, от mime-type зависит интерпретация файлов броузером, во-вторых, обработчик по-умолчанию (при включенной опции RecodeAllFiles обрабатывает только файлы с типом text/html)

AddHandler server-recoded extension1 extension2....
Эта директива указывает, что для файлов с расширением extension1, extension2 и т.п. нужно использовать обработчик server-recoded (название обработчика для mod_mc_htls). Это - второй (кроме директивы RecodeAllFiles) способ указать серверу какие именно файлы являются предметом перекодировки.
Пример: - перекодировать только файлы с расширением .htmlw. Как именно (по какой таблице) их перекодировать определяется директивами UseFileCharset и DefaultFileCarset

Имеющиеся ограничения

Примеры конфигурации

Простейшая конфигурация - перекодировать только файлы .htmlw
AddType text/html .htmlw
FileCharset cp1251 conf/win-koi.tab
UseFileCharset  cp1251 .htmlw
AddHandler server-recoded .htmlw
Перекодировать все файлы text/html, но .htm - по таблице win-koi, а все остальные - по таблице koi-koi. Откусывать <META HTTP-EQUIV
FileCharset koi8 conf/koi-koi.tab
FileCharset cp1251 conf/win-koi.tab
UseFileCharset cp1251 .htm
DefaultFileCharset koi8
RecodeAllFiles on
StripHttpEquivs on