PL20 PL20.5 1. Diffs 1.2.1->1.2.4 merged 2. добавлен 'quick fix' для такой проблемы: Если имеются 'hostname-based' virtualhosts (работающие по заголовку Host: ) и используются номера портов, отличные от 80 (точнее, от заданных директивой Port), то при обращении к (например) http://virtual:8001 будет отдан документ http://real:8001. Это связано с тем, что а) Netscape Navigator ставит заголовок Host: virtual:8001 б) если порт, указанный в заголовке Host: не совпадает с SERVER_PORT (i.e. директивой Port), то заголовок Host: просто не анализируется. Спасибо Это полноценный баг Apache-1.2.x, об нем донесено Apache-Team (через submit bug), но временный фикс в Russian Apache я таки включил. PL20.4 1. Если ETag включает имя кодировки, то вместо пробела между именем кодировки и остальным ETag ставится '-' вместо пробела. 2. Изменена обработка Directory Indexes. Теперь перекодировка и прочие действия для Directory Index осуществляются по реально отдаваемому имени файла, а не по первоначальному URL. Это может иметь значение, если исходная (on-disk) кодировка для директории в целом (заданная, например, директивой CharsetSourceEnc) и для отдаваемого файла не совпадают. Например, если все файлы в директории имеют charset=windows-1251, а файл индекса - koi8-r (т.е. конфигурация примерно такая: DirectoryIndex index.html-k8 AddType text/html html-k8 CharsetByExtension koi8-r html-k8 CharsetSourceEnc windows-1251 ), то при обращении к /somedir/ и к /somedir/index.html-k8 результат будет одинаков. Спасибо am@f1.ru (Andrew Maltsev) ВНИМАНИЕ! Директива CharsetSourceEnc действует и для Directory listing (т.е. для табличек с именами файлов). Я долго думал - правильно это или нет, а потом решил, что для URL внутри HTML-файлов (. PL20.3 1. Убраны несовместимости с "остальным" apache - конструкция inline static и alloca. Спасибо Sergey Vovk Имеющим проблемы со сборкой на каких-либо платформах просьба обращаться. 2. Пофиксен случай, когда документ имеет default content-type (т.е. без расширения, либо расширение не описано в mime.types/AddType). Спасибо Stanislav Sinyagin Замечание. charset=... будет выдаваться для такого документа только если CharsetMactchLanguage Off PL20.2, 21 Jul 1997, Alex Tutubalin 1. CharsetByPort не только задекларирована, но и работает :). Оказывается, то что пишет сервер в переменной SERVER_PORT является бредом и относится только к директиве Port. А никак не к порту, на который пришло реальное соединение. Интересно, как это у меня работало ? Спасибо Stanislav Sinyagin 2. Имевшиеся дубликаты таблиц перекодировки (koi-win и koi8-win) удалены. Спасибо Oleg Bartunov (oleg@sai.msu.su) PL20.1, 20 Jul 1997, Alex Tutubalin 1. Исправлена ошибка в обработке Accept-Charset, приводившая к core в том случае, когда полученный от клиента Accept-Charset был известен серверу, но не был перечислен в директиве CharsetPriority Спасибо Alexey Sheinkin 2. Код, ставящий заголовок Vary теперь не ставит его, если тип ответа отличен от text/*. Для этого пришлось вынести этот код из mod_charset в http_protocol.c Спасибо Alexey Sheinkin 3. Добавлены директива конфигурации CharsetByPort charset-name portnumber В директиве CharsetSelectionOrder появилась token 'Portnumber', Значение CharsetSelectionOrder по-умолчанию - Portnumber Hostname Dirprefix Useragent Все это вместе реализует выбор кодировки "по порту" без описания всего хозяйства в директиве . Удобно в том случае, когда на одной машине по разным IP-адресам живут _разные_ (по content) сервера, а выбор кодировки производится по номеру порта. Скажем, для 4 виртуальных серверов и 4-х кодировок вместо 16-ти директив можно написать что-то вроде такого Listen 80 Listen 8001 Listen 8002 Listen 8003 CharsetByPort koi8-r 8001 CharsetByPort windows-1251 8002 CharsetByPort iso-8859-5 8003 А в директивах не писать ничего про перекодировки. PL20.0, 20 Jul 1997, Alex Tutubalin 1. Добавлены директивы конфигурации CharsetTurnOff Off/On (умолчание - Off) - выключить весь charset-processing module. Может использоваться, когда перекодировка совсем не нужна (скажем, директория содержит текст на японском) CharsetRecodeHeaders Off/On (умолчание - Off) - включить перекодировку заголовков ответа (Location и т.п.). По-умолчанию это выключено для совместимости со старыми (PL12..PL19a) версиями т.к. включение этой перекодировки приводит к несовместимости со старыми версиями если при переходе по Location: происходит смена кодировки. Спасибо Oleg Bartunov (oleg@sai.msu.su) за пример такой несовместимости. 2. Внесены доработки в код, выдающий '304 Not Modified'. Not Modified в ответ на If-Modified-Since: _не_ выдается сейчас в том случае, если выдаваемый документ имел бы заголовок Expires, поставленый by mod_charset. Эти случаи таковы: запрос должен быть HTTP/1.0 и а) выбор кодировки производился по User-Agent б) либо выбор кодировки был по Accept-Charset и выбранная кодировка не совпадает с той, которая была бы выбрана по Hostprefix/Dirprefix PL19 PL19.3 1. Обработчик в mod_charset окончательно уехал в разряд fixups (он там уже бывал). Причиной для этого стало нежелание править mod_negotiations (который ставит вторую копию заголовка Vary: невзирая на наличие этого заголовка в момент обработки). Впрочем ( если рассуждать чисто логически), место этому обработчику именно там - уже после всех прочих обработок URL. 2. Исправлена имеющаяся в Apache-1.2.1 ошибка (в send_http_header), которая приводит к двойной выдаче языка в Content-Language (Content-Language: ru, ru) в случае, когда была language negotiation 3. Исправлена ошибка в перекодировщике заголовков (заголовка Location:) - если никакого charset не было выбрано, то все падало в core. Спасибо Oleg Bartunov (oleg@sai.msu.su) 4. Теперь перекодируются все заголовки. Довольно своеобразным способом - - если символ там был в виде %AA, то он в такой вид и перекодируется (%BB), если символ был "символом" (например, '+', '?' или 'ы'), то он тоже будет перекодирован в соответствии с текущей таблицей. Таким образом, вся ответственность за представление символов в заголовках (i.e. %xx или символ, пробел или '+' и т.п.) лежит на том, кто эти заголовки производит. Никакой самодеятельности. 5. Приведено в соответствие содержимое дистрибутивных конфигурационных файлов. Надеюсь что ничего не забыл. В httpd.conf-dist все директивы mod_charset убраны в "скобки" ... В srm.conf- написан комментарий про то, что ScriptAlias не живет с MultiViews и про то, как это обойти. 6. В дистрибутив добавлены все имеющиеся в распоряжении автора таблицы перекодировки PL19.2 1. Код, вырезавший вставлял \0 от строки meta http was here. Исправлено. Спасибо, только вот не помню кому - письмо поубивал. 2. Запросы, обрабатываемые через Action (и все прочие, работающие через internal_redirect) теперь перекодируются только один раз (а не два). Как следствие, сохраняются русские URL, а выбор кодировки происходит по первоначальному URL, а не по скрипту, заданному в Action. Спасибо всем, кто мне об этой баге писал. 3. Производится перекодировка заголовка Location в HTTP-Response. Теперь Location: some.cgi?русский+текст дойдет до пользователя в правильном виде. 4. В httpd.conf-dist ISO_8859:5 заменен на ISO-8859-5 повсеместно, а не частично. Спасибо "Khimenko Victor" 5. Чуть-чуть подправлена функция, перекодирующая заголовки от клиента. Спасибо Artem Podstreshny PL19a 1. Убрана недоделка, приводившая к выдаче Expires: для типов, отличных от text/* 2. При выдаче Expires: в обязательном порядке выдается Last-Modified (в случае, когда Last-Modified не имеет смысла - CGI/SHTML - выдается текущее время сервера). 3. Если в текущих для данного документа установках CharsetSelectionOrder нет выбора User-Agent, то Expires/Vary: user-agent не выдается. 4. Исправлена ошибка, приводившая к мусору в содержимом cp_flags (правда в PL18 использовался только один бит из него, который всегда устанавливался корректно) 5. Убрана "ругань" в логи в случае, когда для документа не удается найти нужный charset. Сделано это по той причине, что администратор сервера имеет право не настраивать этот модуль и в этом случае все должно работать так, будто модуля просто нет. 6. :) Выражение в assert в http_bprintf.c сделано более ANSI-совместимым. Хотя это ни на что и не влияет. gcc 2.7.2.2 с опцией -Wall теперь не ругается (FreeBSD 3.0-beta) - а значит цель достигнута. PL18 21-Jun-1997, Alex Tutubalin В обеих версиях (1.1.3 & 1.2): 1. "Задекларирована" поддержка маковской кодировки (три строчки в httpd.conf, которые нужно раскомментарить). Cоответствующие части были присланы Dmitry Yu. Altukhov , за что ему спасибо. Он же утверждает, что название кодировки x-mac-cyrillic hardcoded в Netscape и MS IE for Mac, и что кодировка должным образом переключается. Проверить или предложить что-то еще я не могу. В 1.1.3 PL18: 2. Правки приведены в соответствие с PL18 for Apache-1.2. В настоящее время mod_charset одинаков для 1.1.3 и для 1.2 (но правки в http_protocol.c разные т.к. сам протокол разный) В 1.2.0 3. Это не Changes, a TODO на всеобщее обозрение. Нужны добавки в test-suite для проверки функциональности HTTP/1.1 Apache 1.2.0-PL18e 20 Jun 1997, Alex Tutubalin 1. Исправлена ошибка в коде, определяющем нужно ли выдавать заголовок Expires (В случае наличия и Accept-Charset и URL prefix и несовпадения задаваемых ими charset Expires все-равно не выдавался) 2. Определение того факта, что компиляция происходит для Apache-1.2 делается не через #ifdef SERVER_BASEVERSION, а через проверку MODULE_MAGIC_NUMBER. За оба исправления спасибо Dmitry Khrustalev 3. Убрано -DUSE_NOLOG_FOR, как отжившая свое. Поддержки этой feature в Apache-1.2 не будет Apache 1.2.0-PL18d 16-17 Jun 1997. I. Приложены патчи от Dmitry Khrustalev . В них содержится 1. Поддержка для Accept text/x-cyrillic-... (Мироновский хак Mosaic) сделана optional (разрешается путем задания ключа компиляции -DXCYRILLIC). Связано это с тем, что выбор кодировки по Accept создает дополнительные трудности с HTTP/1.1-кэшированием таких документов. 2. Добавлена выдача заголовка Vary: 3. Убрана ошибочка, приводившая к невозможности компиляции http_bprintf.c без -DUSE_TRANSFER_TABLES II. Несколько исправлена стратегия выдачи заголовка Expires:. Он _не_ выдается теперь в следующих случаях (на выбор): а) (виртуальный) сервер знает только один Charset (вообще говоря, с новой системой директив это нереально если кодировка на диске отличается от кодировки клиента). б) Включена опция CacheNegotiatedDocs в) Выбор кодировки производился по Hostname или Dirprefix и клиент не выдавал заголовка Accept-Charset г) Клиент выдал Accept-Charset, но Hostname/Dirpefix указывали на тот же Charset (т.е. если бы Accept-Charset не было, то был бы все-равно выбран тот же charset) Правила а) и б) работали и ранее. В правиле в) порядок поиска кодировки задается директивой CharsetSelectionOrder. В правиле г) выбор кодировки идет по Accept-Charset, а проверка Hostname/Dirprefix производится в соответствии с CharsetSelectionOrder. Эта правка должна привести к тому, что документы, лежащие в (например) /windows-1251/ будут кэшироваться как на proxy-серверах, так и на клиенте. Apache-1.2.0-PL18c. 14-Jun-1997, Alex Tutubalin 1. Внесены правки в 1.2.0, теперь оно совместимо с 1.1.3-rus PL18c 11-Jun-1997, Alex Tutubalin 1. Теперь apache не ругается, если в директивах, где должно быть имя кодировки, объявленной через CharsetDecl написано неправильное (необъявленное ранее) имя кодировки. Это неправильно, но сохранить такой syntax check невозможно из-за особенностей апача. Спасибо Ilya Balashov PL18b 09-Jun-1997, Alex Tutubalin 1. "Расширением" для директивы CharsetByExtension теперь может считаться что угодно, не содержащее '/'. Т.е. определение CharsetByExtension koi8-r .html.ru.koi8-r будет работать нормально. Спасибо Естественно, таким расширениям нужно присвоить соответствующий MIME-type, дабы они понимались как HTML. Да, PL18a содержал ошибку и считал расширением все после первой точки, а не после последней (в отличие от написанного в документации). 2. Исправлена ошибка с обработкой пустой директивы CharsetSelectionOrder. Сейчас такая пустая директива приводит к отмене выбора charset по всем трем правилам (Hostprefix/Dirprefix/Useragent). Было (и это было ошибкой) - пустая директива приводила к переключению на default order. 3. Введена директива CharsetMatchLanguage. Если она включена (состояние по-умолчанию для совместимости со старыми версиями), то charset=xxx выдается в заголовке Content-type только при соблюдении таких трех условий: а) В заголовке User-Agent, полученном от клиента, не содержится подстрок, описанных директивой CharsetBadAgent б) включена опция MultiViews в) Language, описанный для выдаваемого Charset директивой CharsetDecl совпадает с Language, описанной для данного типа документов директивой AddLanguage Если флаг CharsetMatchLanguage выключен, то сервер проверяет только первое условие (User-Agent: vs CharsetBadAgent). PL18a 08-Jun-1997, Alex Tutubalin 1. Введена новая система директив, полностью отличающаяся от старой. Слишком много, чтобы описывать в Changes. Описание директив доступно на http://apache.lexa.ru/configurePL18.html PL17: Промежуточная версия, снятая с производства. Заменена на PL18 PL17b: 30-May-1997, Alex Tutubalin 1. Исправлена недоделка в коде чтения таблиц перекодировки. Сейчас значения большие 255 считаются ошибкой. Спасибо Eugene Mamchits (eugin@ips.ras.ru) 2. Исправлена ошибка в PL17 (более ранние версии не затронуты), приводившая к неправильной (инвертированной :) обработке BadAgent/NotSoBad. 3. Исправлен и упрощен код, отвечавший за одновременную обработку CharsetPriority и Accept-Charset в запросе пользователя. Ошибка могла проявиться только в случае, когда в user query были заданы с одинаковым приоритетом несколько charsets, известных серверу. Этот случай мне в практике еще не встречался :) 4. Добавлена директива CharsetName (может встречаться в server config, , , .htaccess). Назначение ее - подменить "официальное" имя charset в строчке Content-Type в выдаче сервера (более нигде). Пример: CharsetTable wkoi8 conf/win-koi.tab ru CharsetAlias wkoi8 koi8-r AgentCharset wkoi8 (X11; Lynx CharsetName wkoi8 koi8-r - во всех внутренних "делах" сервера (определение charset, перекодировка и так далее) будет использоваться имя wkoi8, а в выдаче клиенту - charset=koi8-r Возможное применение - определить несколько групп CharsetTable (например, для директорий в которых файлы лежат в разных кодировках), а потом подменить CharsetName для этих CharsetTable, дабы выдача пользователю была корректной). Внимание! Эта директива используется только в момент формирования заголовков ответа сервера, для всех прочих целей (т.е. ссылок на Charset по имени в конфигурации сервера) нужно использовать имя Charset из директивы CharsetTable. Директива CharsetName даже не добавляет строчку в список CharsetAlias (дабы избежать двусмысленностей, когда несколько Charset имеют одинаковый Alias) - поэтому имейте это в виду. Тут есть еще некоторое количество тонкостей, связанных с механизмом обработки запроса, но все эти тонкости подробно разжеваны в документации на Apache. 5. Добавлена директория test-suite, в которой лежат скрипты для netcat, которыми удобно делать проверку функциональности. Буду рад всяческим добавлениям в эту директорию. PL17a: 27-May-1997, Alex Tutubalin 1. Исправлена очередная ошибка с переполнением стека, на этот раз в rvputs (ей, как я понимаю, вообще ни один модуль не пользуется) 2. mod_charset полностью переписан. Почти полностью сохранен основной алгоритм, но реализующий его код переписан. Главная цель была - сделать все более приближенным к апачевским стандартам (использование имеющихся таблиц и массивов вместо доморощенных структур данных и т.п.), дабы облегчить перенос под Apache 1.2 В качестве побочного эффекта достигнуто то, что любая директива, кроме CharsetTable может быть написана в .htaccess (для этого должно быть разрешено AllowOverride FileInfo). PL16: 10-May-1997, Alex Tutubalin 1. Исправлена ошибка в mod_charset, которая приводила к выдаче неправильного (неканонического) названия charset при обращении к файлам в пользовательском каталоге (/~user/file.html). Спасибо E.B.Byrganov@inp.nsk.su (Eugene B. Byrganov) 2. В дистрибутивном конфиг-файле httpd.conf-dist исправлено каноническое название CharsetTable ISO... с ISO_8859-5:1988 на ISO-8859-5 Спасибо E.B.Byrganov@inp.nsk.su (Eugene B. Byrganov) 3. Исправлена ошибка (feature?) в обработке server-side-includes, которая выражалась в том, что включенные статические документы иногда :) не включались, а выдавалась ошибка. Ошибка была связана с тем, что директива If-modified-since (которую выдают многие броузеры) учитывалась и при обработке подзапросов (includes), и если включенный документ был "старше" то он не выдавался. Ошибка присутствовала и в оригинальном apache-1.1.3, но маскировалась тем, что для Server-parsed документов сам сервер никогда не выдавал Last-Modified, поэтому броузеры не ставили If-modified-since. Ошибка _могла_ проявляться при работе через Proxy-серверы, которые проверяют измененность документа через If-modified. Т.е. в таком случае документ возвращался пользователю (и proxy) без включенных частей. Спасибо Oleg Bartunov (oleg@sai.msu.su) за то, что напомнил мне об этой ошибке. Я на эти грабли наступил давно, но т.к. никто больше не жаловался, то считал что я один такой несчастный. 08-May-1997, Alex Tutubalin Исправлена ошибка с переполнением стека на 1 байт в rputs(). Ошибка приводила к глюкам модулей, использующих rputs под операционными системами, в которых alloca() возвращает ровно столько байт, сколько просят. Из таких систем мне известен только Linux. Ошибка приводила к зацикливанию mod_status под Linux (под FreeBSD и Solaris/SPARC все работало прекрасно). Спасибо Oleg Bartunov (oleg@sai.msu.su) PL15: PL15Release, 25 Apr 1997, Alex Tutubalin По совету Andrey Chernov (ache@nagual.ru), в "дистрибутивном" конфигфайле закомментарена директива NotSoBad (см ниже), а в BadAgent _явно_ указаны версии bad agent'ов. PL15c 19-Apr-97, Alex Tutubalin 1. Решение 'проблемы lynx'. Проблема заключается в том, что старые версии Lynx (2.3,2.4) дуреют от указания charset= в Content-Type, а новые (2.5FM,2.6,2.7) обижаются и неправильно показывают, если charset= не указан. В силу первого, исключать lynx из списка BadAgent нельзя, перечислить там все возможные старые Lynx'ы похоже тоже нельзя (их слишком много разных). В PL15c реализован список исключений из BadAgent - директива NotSoBad. Синтаксис таков: BadAgent lynx arena # плохие агенты, которым нельзя показывать charset NotSoBad Lynx/2.7 # исключения из верхнего списка. Т.е. если в заголовке UserAgent: находится строка, удовлетворяющая обоим спискам, то агент не считается "плохим". На мой взгляд, так проще, чем описывать в BadAgent все возможные разновидности lynx'ов. Через некоторое время, когда Lynx 2.4 и младше изчезнут из обращения, об этой опции можно будет забыть. Возможно я и перестарался с этой опцией, но у меня в логах отмечен почти десяток старых разновидностей lynx и я уверен, что это далеко не все. В "дистрибутивном конфиге" в списке NotSoBad перечислены Lynx'ы, которые обращаются с charset= нормально. Проверял лично и только то, что было под рукой. Буду рад дополнениям к этому списку. Пока там 2.5FM. 2.6 и 2.7 Спасибо Andrew Chernov 2. Исправлена "чужая" ошибка - mod_include.c не вызывает set_last_modified() вследствие чего не ставились заголовки Last-Modified и Expires, что должно было приводить к проблемам с кэшами. Т.к. это упущение может быть свойственно и другим модулям, то надежнее оказалось исправить это в send_http_header. Теперь заголовки Last-Modified и Expires будут выдаваться всегда, если имело место content negotiation _и_ модуль вызывает send_http_header. Если модуль не вызывает set_last_modified сам, то в заголовок Last-Modified будет поставлена текущая дата, содержимое Expires зависит от ключей компиляции (если собирать с -DEPOCH_EXPIRES, то в Expires будет 01 Jan 1970). Это исправление _не_лечит_ модули, которые не вызывают send_http_header, а выводят все нужные им заголовки сами. Раз они решили делать все сами, то (увы) прочее - не наша забота Ошибка выплыла в процессе разборок "почему кэшируются .shtml". Спасибо всем, кто мне об этом писал. 3. mod_charset.c и mod_ranges.c отформатированы с помощью XEmacs c-mode Сделано по просьбе Nikolay Saukh . Как следствие, diff pl15b->pl15c будет большим. PL15b,13.04.97, Alex Tutubalin 1.При поиске charset по User-Agent теперь ищется наиболее длинное совпадение имени агента со строкой AgentCharset в конфигфайле. Т.е. если у вас написано AgentCharset koi8-r (X11 AgentCharset iso8859.5 "Mozilla-super-duper (X11" а клиент (user-agent) называется Mozilla-super-duper (X11; SUPER-DUPER-OS) то "сработает" более длинное описание. Если клиент "описывается" двумя подстроками одинаковой длины, то "сработает" то описание, которое находится раньше в httpd.conf Спасибо Nickolay Saukh 2. Корректно (корректнее?) обрабатывается ситуация, когда клиентский софт говорит Accept-Charset: some,*,some2 и ни один из some/some2 неизвестен серверу (этим поведением отличается Netscape Communicator 4.0b3 как минимум - он просит iso-8859-1,*,utf-8). Ранее клиенту отдавался NativeCharset, и писалась ругань в лог. Теперь (если все явно заданные чарсеты серверу неизвестны) в лог ничего не пишется, а сервер ведет себя как попросили - считается что '*' означает 'любой charset' и выбор charset производится по прочим параметрам (URL, User Agent) Спасибо Ilya Balashov 3. Начиная с этого момента я пишу длинные комментарии в changelog. PL15a,06.04.97, Alex Tutubalin 1. Не производится перекодировка для аргументов SSI. Это касается прежде всего конструкций вида Теперь они должны работать корректнее. 22.02.97 PL14 1. Добавлена пеpекодиpовка в функции rprintf/rputs/rvputs. Как следствие, коppектно написанные модули тепеpь должны полностью pаботать с пеpекодиpовкой (pанее pаботали только модули, котоpым хватало функции rputc) 2. Добавлен ключ компиляции -DEPOCH_EXPIRES Если он задан на момент компиляции,то в заголовке Expires: будет 01 Jan 1970 00:00:01 вместо текущей даты. Это может помочь пpавильно кэшиpовать (веpнее - не кэшиpовать) такие документы в случае pассинхpонизации часов на клиенте 14.11.96 PL12 1. Исправлена ошибка при выборе charset в запросе типа: http:/~user/codepage/.. Спасибо Eugene Rakhmatulin 3. Исправлена ошибка выдачи диагностики, при отсутствии затребованного клиентом charset (указатель на NULL). Не помню, кто обнаружил, был слишком длинный форвардинг, по-моему andy@snm.demos.su (Andrew A. Vasilyev) 4. Добавлена табличка для Mac 5. При определении "плохих" агентов теперь ищется подстрока по шаблону, а не сравнение с начала User-agent. Это связано с невозможностью определить плохим агентом MSIE 3.0, который пишет в поле User-Agent: Mozilla/2.0 (compatible; MSIE 3.0; Windows NT) спасибо Boris Tobotras 27.09.96 PL11 1. Исправлена ошибочка о выборе charset в SSI при использовании метода по преффиксу uri если документ содержал в себе include не принадлежащий дереву. Спасибо Alex Tutubalin . 2. Исправлена ошибка, связанная с тем, что структура, определяющая charset была объявлена как глобальная. Теперь указатель на эту структуру входит в структуру запроса request_rec и заполняется для каждого запроса индивидуально. Аналогично и для модуля mod_ranges. Спасибо Alexander Ermolaev и Dmitry A.Deineka" 3. Добавлена возможность выбора charset по преффиксу URI для директорий пользователей (например /~user/win/file, /~usr/koi/file и.т.д.) Спасибо am@f1.ru (Andrew Maltsev) 4. Исправлена ошибка выдачи имени charset alias name вместо официального имени charset, если выбор charset осуществился по имени сервера или по преффиксу uri. Спасибо am@f1.ru (Andrew Maltsev) 5. Добавлены директивы: NoHostnameCharset on/off NoUriCharset on/off По умолчанию сервер пытается найти charset в имени сервера и/или в преффиксе URI. Эти директивы запрещают такой поиск. Спасибо Nickolay Saukh 25.07.96 PL10 1. Улучшен анализ на необходимость выдачи Expires: раньше этот заголовок не выдавался в случае если имело место и language negotiation т.к. mod_negotiation принудительно ставил флаг r->no_cache в 1, а не накладывал маску на младший бит |= 0x01 2. Исправлена ошибка в charset negotiation для серверов, у которых не определено ни одного charset, приводившая к core. 3. Исправлена ошибка о принятии решения о типе кодировки при поиске подстроки в URL. Раньше сервер считал, что http://ms.f1.ru/comp/msdos/* представленны в альтернативной кодировке Теперь проверка только на соответствие в начале имени хоста и/или URI. Спасибо "Andrew Maltsev" 12.07.96 1. Реализован механизм согласования charset в совокупности с с согласованием language. Изъята дурацкая проверка на коды > 0x7f Content-type: text/foo; charset=... будет выдаваться только для документов, язык которых позволяет такой charset, для любого кол-ва языков могут быть определены свои charsets. Признаком языка считается принятое в apache соглашение о расширеннии имени файла (например: index.html.ru, index.html.en), при этом ссылки на uri без языкового расширения продолжают работать т.е. если нет реального файла index.html будет выбран один из index.html.ru, index.html.en согласно языковым приоритетам и, возможно, будет установлен charset (если определен), а также Expires: при необходимости. 2. Исправлена ошибка приводящая к core при использовании внутренних ssi, спасибо Alexander Ermolaev 3. Реализована обработка запросов вида: Accept-charset: name1; q=..., name2; q=... 4. Изменен как мне кажется, в лучшую сторону синтаксис почти всех директив: CharsetTable oficial_name tab1 [tab2] ru CharsetAlias oficial_name alias1 alias2 alias3 ... NativeCharset oficial_name (не изменилось) AgentCharset oficial_name user_agent_pattern1 user_agent_pattern2 .... 5. Добавлены директивы: BadAgent lynx arena name3...- для указания шаблонов агентов, не распознающих MIME в заголовках RejectErrorCharset on/off - для указания реакции сервера на неправильно запрошенный charset (по умолчанию сервер выдает документ как может) CharsetAgentPriority on/off - для указания приоритета в поиске charset между именем сервера/uri и идентифицируемым User-agent CharsetPriority cset1 scet2 ... - для принятия решения сервером о необходимом charset в случае равенства весов, кроме того, старший из них будет использоваться как native в случае отсутствия директивы NativeCharset 6. Изъяты вызовы функций перекодировки из функций rputs(), rprintf(), rvputs() т.к. сервер использует их исключительно для внутренних нужд, а не для передачи документов. Зачастую они вызываются сервером без привязки к конкретному запросу, что раньше приводило к множественным глюкам. Если кто-либо захочет их использовать из своих модулей, написанных для apache - должен будет вставить перекодировку самостоятельно. Также изъята попытка выдавать charset при выдаче ошибок сервером. Сообщения об ошибках выдаются сервером только в iso8859-1. 7. Исправлено много ошибок (все не упомню, если сразу не записал) Скорее всего - не все и добавлены новые :) 8. Изъята (возможно временно) поддержка header/footer файлов, как потенциально глюкавая. Она вообще кому-нибудь кроме меня нужна? 9. Исправлена ошибка в read_clients_block и send_error_response (http_protocol.c), связанная с тем, что указатель на цепочку charset мог быть еще не проинициализирован. Nickolay Saukh 10. Исправлена ошибка в поиске charset по полю Accept: text/x-cyrillic-... Отсутствовала проверка на окончание поля. Alexander Ermolaev 11. Исправлена ошибка выдачи последнего псевдонима charset вместо самого названия charset при согласовании по User-agent. Спасибо Nickolay Saukh 15.06.96 PL9 1. Исправлена ошибка, при удачном charset negotiation, запрешалось кэшировать все файлы, а не только те, чей Content-type: text/... Кроме того, теперь для документов выдается Last-modified и Content-length где это возможно. Если имело место charset negotiation, выдается и Expires: Спасибо "Igor V. Semenyuk" 2. В заголовке Content-type выдается charset=... только в документах которые имеют атрибут text/... и содержат в себе символы, коды которых > 0x7f. Этот же факт теперь является необходимым условием для выдачи заголовка Expires. Достаточным условием для выдачи Expires является то, что сервер знает несколько charset и документ содержит коды символов > 0x7f и его Content-type: text/.... т.е. если сервер может потенциально выдать данный документ в разных charset. 3. Изменен формат директивы CharsetTable, теперь имена файлов-таблиц указываются от корня сервера. Nickolay Saukh 4. Изменена стратегия выбора charset в случае отсутствия charset negotiation. Больший приоритет имеет теперь наличие имени charset в имени URI, чем выбор charset по User-agent, а не наоборот. Спасибо "Paul S. Hrobostov" . 5. При наличии как входной, так и выходной таблиц для charset в директиве CharsetTable, один из файлов не закрывался. Исправлено. 6. При появлении в Content-type значения charset=... помимо воли сервера (из cgi или .var) теперь этот charset удаляется, и подставляется правильный, в зависимости от выбранного сервером charset. Спасибо Nickolay Saukh . 7. Если затребованный клиентом charset неизвестен серверу и Content-type затребованного URI = text/... то сервер он возвращает 404 Not found, раньше он выдавал в NativeCharset документ. 8. Изменено название модуля mod_cyrillic на mod_charset, как более соответствующее истине. 9. Введена директива CharsetAlias для исключения описания таблиц. 10. В mod_charset.h default charset установлен в iso-8859-1 11. Добавлены коментарии в conf/httpd.conf.