| ||||||||||||||||
|
Да. Пошлите письмо из одной строчки subscribe apache-rus
по
адресу majordomo@lists.lexa.ru.
Корректно ответить на этот вопрос невозможно, но наиболее частые причины такие:
Проверьте, описана ли таблица перекодировки для данного сочетания клиентской кодировки и кодировки хранения. Если таблица не описана, то сервер сам построит "пустую" таблицу, т.е. никакой кодировки не будет.
Проверьте, не используете ли вы случайно директиву CharsetRecodeTable вместо правильной директивы CharsetWideRecodeTable
Это - feature.
Варианты решения:
<Location /path/to/upload.cgi> CharsetDisable On </Location>и делайте перекодировку сами.
Это - тоже feature. Решений тоже два:
Script PUT /path/to/put.cgi <Location /path/to/put.cgi> CharsetDisable On </Location>
При обработке CGI и определении кодировки по URL, кодировка
определяется по URL CGI-скрипта. Если вы используете определение
кодировки по префиксу директории (/win/file.html
), а скрипт имеет
URL /cgi-bin/myscript.sh
, то результат очевиден.
И не должны. Корректная перекодировка proxy-запросов в общем случае нереальна - далеко не все серверы сообщают о кодировке отдаваемого документа т.е. нельзя узнать из какой кодировки нужно перекодировать в кодировку клиента.
Если вы хотите использовать ProxyPass для отображения соседнего сервера в дерево документов Russian Apache с их перекодировкой (например, для решения проблем перекодировки у MS IIS, Lotus Domino и так далее), то возможны по меньшей мере два варианта:
Сначала прочитайте
документацию к оригинальному Apache.
Потом найдите у себя в конфигурации строчку
<VirtualHost vhost.my.domain>
и замените ее на
<VirtualHost vhost.my.domain:*>
Продолжайте читать документацию до просветления
Найдите в конфигурационном файле директиву Port и удалите ее - при Listen на нескольких портах она только мешает.
Background. При автоматическом определении кодировки, "Russian Apache" ставит заголовок Expires: 1 Jan 1970 для того, чтобы предотвратить оседание документа в транзитных proxy-caches. Если такое оседание будет происходить, то последовательные обращения к документу клиентами с разной кодировкой через один cache будут приводить к выдаче документа в неправильной кодировке. В качестве побочного эффекта, появляется некэшируемость таких документов и в локальных кэшах броузеров и перезагрузка их при нажатии "Back" и так далее.
Новое решение (работает с версии PL28.0)
Начиная с версии 1.3.4PL28.0 у сервера появилась возможность делать автоматическое
перенаправление пользователя на документ в "его" кодировке. Это делается
директивой CharsetAutoRedirect.
Для начала, вам нужно решить, каким образом вы будете формировать URL с жестко-привязанной
кодировкой (см обсуждение разных вариантов в этом документе).
Допустим, вы решили использовать перекодировку "по портам". Тогда в конфигурации
сервера можно написать что-то в таком духе
Listen 80 Listen 8100 Listen 8101 CharsetByPort koi8-r 8100 CharsetByPort windows-1251 8101 CharsetAutoRedirect koi8-r http://www.yourdomain.ru:8100/ CharsetAutoRedirect windows-1251 http://www.yourdomain.ru:8101/windows-1251Последние две строчки означают, что для всех документов, для которых сервер определил кодировку, будет происходить redirect с добавлением соответствующего префикса к URL. Для настроек по-умолчанию (т.е. как в дистрибутивной конфигурации), при обращении к URL http://www.yourdomain.ru/file.html сервер будет определять кодировку по клиентскому броузеру. Если клиентская кодировка - cp1251, то сервер выдаст redirect на http://www.yourdomain.ru:8101/windows-1251/file.html, если кодировка клиента - кои8, то редирект будет выдан на http://www.yourdomain.ru:8100/file.html
CharsetByPort koi8-r 8101 # ! 1. CharsetByPort windows-1251 8100 # !!! CharsetSelectionOrder Portnumber Useragent CharsetAutoRedirect koi8-r http://www.yourdomain.ru:8100/ CharsetAutoRedirect windows-1251 http://www.yourdomain.ru:8101/После первого редиректа (скажем на www:8101/file.html для клиента с кодировкой cp1251) сервер определит кодировку для нового URL по порту. Поймет что это koi8 (по первой директиве CharsetByPort) и выдаст новый редирект. Процесс будет бесконечным.
Чтобы выборочно отключить redirect (например, для каких-то определенных броузеров, что может быть нужно для поисковых систем) нужно выставить переменную окружения CHARSET_NOREDIRECT. Например так:
BrowserMatch htdig CHARSET_NOREDIRECT- это выключит редирект для User-Agent: htdig
Старое решение (версии PL27 и более древние).
DirectoryIndex index.cgi index.htmlindex.cgi в корневой директории сервера может выглядеть как-то так:
#!/usr/local/bin/perl $realindex="/index.html"; %porttable = ( "koi8-r" => 8101, "windows-1251" => 8102 ); if($ENV{CHARSET_SERVER_NAME}=~/:(8101|8102)/) { #already on another port print "Location: $ENV{CHARSET_HTTP_METHOD}$ENV{CHARSET_SERVER_NAME}$realindex\n\n"; } else { # WWW host without port - default port assumed $var = $ENV{CHARSET_SERVER_NAME}; $var=~s/:(\d+)$/:$porttable{$ENV{CHARSET}}/; print "Location: $ENV{CHARSET_HTTP_METHOD}$var$realindex\n\n" }Для URL с "жестко" заданной кодировкой полезно еще включить директиву CharsetDisableAcceptCharset On - это лечит ошибку в обработке заголовка Vary у MS IE 4.0x. Эта директива доступна, начиная с PL27.0
При выдаче html-документа клиенту происходит только "побуквенная" перекодировка,
сам HTML не парсится и элементы вида
<a href="script.cgi?param=%AA%BB%CC%DD">
не перекодируются. При этом клиент получает такие URL в кодировке сервера.
В то же время, строки GET-запросов с param=%AA%BB%CC%DD перекодируются из
кодировки клиента в кодировку сервера. Чтобы все было хорошо, необходимо
писать ссылки (HREF) открытым текстом:
<a href="script.cgi?param=русский+текст">
.
Второй вариант, более соответствующий стандартам, - писать все в виде %AA%BB, но в кодировке клиента. Для этого можно использовать Russian Apache API (в модулях) и Russian Apache Perl API - в модулях, написанных для mod_perl и скриптах, исполняемых под Apache Registry.
Возьмите PHP версии 3.0.2a или новее. Там появилась поддержка Russian Apache, которая включается через ./configure --with-mod_charset.
FastCGI использует для вывода не стандартные функции Apache API, а функцию bwrite, вывод которой не перекодируется. Возьмите патч здесь (если используется Russian Apache 1.3.x или новее, то слова USE_TRANSFER_TABLES нужно заменить на RUSSIAN_APACHE).
Заголовок Expires:
выдается сервером именно для того, чтобы избежать
кэширования этих документов в "транзитных" proxy-серверах. Допустим на
секунду, что такой заголовок не выдается. Допустим, пользователь с Unix (кодировка koi8)
пришел на ваш сервер http://yourserver.ru через прокси cache.yourserver.ru. Т.к. документы
можно кэшировать, то в прокси осядет этот документ в кодировке koi8. Следующий пользователь
того же proxy получит этот документ в koi8, даже если его родная кодировка - cp1251. Придется
жать Reload, но скажем поисковые серверы этого делать не будут.
Вывод простой - если один и тот же URL может иметь разное содержимое (кодировки), то он не должен кэшироваться. Кэшироваться могут только документы, кодировка которых определяется по URL, а не по заголовкам, пришедшим от документа.
HTTP/1.1 позволяет более тонко управлять кэшируемостью через заголовок Vary:
.
Russian Apache поддерживает этот механизм и не выдает Expires на HTTP/1.1 запросы.
Чтобы избежать выдачи некэшируемых документов, необходимо сразу перенаправлять клиента на URL, для которого выдается кэшируемый документ. Как это сделать написано выше.
BrowserMatch my-cool-spider CHARSET_NOREDIRECT
patch
которая работает по контексту. Если контекст нарушен "чужими"
правками, то автоматически нужные изменения внесены быть не могут.configure
от mod_ssl.AuthType BasicТак как password-protected URLs все-равно не должны кэшироваться в транзитных proxy, то от предлагаемого решения никто не страдает.require valid-user CharsetNormalizeToURL none
LogLevel debug
и доложите в архив еще и трассировку ошибочного запроса из
error_log
gdb httpd (gdb) core /path/to/core (gdb) where ... выдача места паденияВыдачу gdb доложите в тот же архив.
"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 |
|
|