______________________________________________________________
Корректно ответить на этот вопрос невозможно, но наиболее частые причины такие:
Вы скомпилировали Apache без mod_charset или без ключа компиляции -DRUSSIAN_APACHE. Проверить это очень просто - httpd -l выдает список модулей, среди них должен присутствовать mod_charset.c.
Часто это происходит от того, что в качестве заготовки файла Configuration берут Configuration.tmpl, в котором mod_charset.c отсутствует.
В вашем файле конфигурации отсутствуют директивы настройки перекодировок. В этом случае сервер работает (во всяком случае должен) в точности как обычный Apache
Вы проверяете все каким-то броузером, который корректно показывает любой charset (MS IE 3-4.x, Netscape 4.x, Lynx 2.6+). В этом случае сервер производит все перекодировки, но клиент этого не видит. Единственный способ действительно проверить работу сервера - это использовать telnet www.yourdomain.ru 80 или что-то в этом духе (netcat, netpipes и т.д.).
______________________________________________________________
Проверьте, описана ли таблица перекодировки для данного сочетания клиентской кодировки и кодировки хранения. Если таблица не описана, то сервер сам построит "пустую" таблицу, т.е. никакой кодировки не будет.
Проверьте, не используете ли вы случайно директиву CharsetRecodeTable вместо правильной директивы CharsetWideRecodeTable
______________________________________________________________
Это - feature.
Варианты решения:
запретите все перекодировки для скрипта, который разбирает FileUpload, например таким способом:
<Location /path/to/upload.cgi>
CharsetDisable On
</Location>
и делайте перекодировку сами.
Используйте директиву CharsetRecodeMultipartForms, которая появилась в PL23, но при этом вам все-равно придется перекодировать вручную текстовые части запросов. Для этого можно использовать Russian Apache API, доступное в других модулях или Russian Apache Perl API, доступное из mod_perl.
Это - тоже feature. Решений тоже два:
Запретить перекодировку для данного скрипта:
Script PUT /path/to/put.cgi
<Location /path/to/put.cgi>
CharsetDisable On
</Location>
Используя директиву CharsetRecodeMethodsIn (появилась начиная с PL23) запретить перекодировку для метода PUT.
При обработке CGI и определении кодировки по URL, кодировка определяется по URL CGI-скрипта. Если вы используете определение кодировки по префиксу директории (/win/file.html), а скрипт имеет URL /cgi-bin/myscript.sh, то результат очевиден.
И не должны. Корректная перекодировка proxy-запросов в общем случае нереальна - далеко не все серверы сообщают о кодировке отдаваемого документа т.е. нельзя узнать из какой кодировки нужно перекодировать в кодировку клиента.
Если вы хотите использовать ProxyPass для отображения соседнего сервера в дерево документов Russian Apache с их перекодировкой (например, для решения проблем перекодировки у MS IIS, Lotus Domino и так далее), то возможны по меньшей мере два варианта:
Использование Apache::Gateway (требует mod_perl для работы).
Использование самодельного Action-script или подобного CGI, который будет сам делать запросы к удаленному серверу, а затем выдавать их клиенту.
Сначала прочитайте документацию к оригинальному Apache. Потом найдите у себя в конфигурации строчку
<VirtualHost vhost.my.domain>
и замените ее на
<VirtualHost vhost.my.domain:*>
Найдите в конфигурационном файле директиву Port и удалите ее - при Listen на нескольких портах она только мешает.
При выдаче 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
Если хочется, чтобы все неизвестные User-Agents не получали redirect, то возможно вам поможет директива CharsetNoRedirectForDefaultCharset. Эта директива поддерживается начиная с версии сервера 1.3.6 rus/PL28.16.
______________________________________________________________
Варианты решения:
Общий случай. И Russian Apache и mod_ssl требуют внесения изменений в исходные тексты самого Apache (т.е. не могут быть реализованы как независимые модули). К сожалению, часть правок производится в одних и тех же файлах (для Apache 1.3.9 и mod_ssl 2.4.1 это htdocs/index.html, Makefile.tmpl, src/include/httpd.h). Правки вносятся утилитой patch которая работает по контексту. Если контекст нарушен "чужими" правками, то автоматически нужные изменения внесены быть не могут.
Поэтому наиболее общий порядок действий такой - взять Russian Apache нужной версии, взять mod_ssl нужной версии, запустить configure от mod_ssl.
Прежде чем запускать компиляцию, нужно найти все файлы с расширением .rej - в них записываются те изменения, которые не удалось - посмотреть в них и довнести изменения руками.
Частные случаи.Russian Apache 1.3.9 PL28.18 сделан совместимым "по патчам" с mod_ssl 2.4.1. Для более поздних (и более ранних) версий возможно потребуется процедура, описанная выше.
Да, действительно, у нетскейпа есть проблема - он обижается получив редирект-запрос пароля-еще редирект. Решение просто как все гениальное:
AuthType Basic
require valid-user
CharsetNormalizeToURL none
Так как password-protected URLs все-равно не должны кэшироваться в транзитных proxy, то от предлагаемого решения никто не страдает.
|
А так же... |