Apace2 и кодировка
Вот кусок apache2.conf, отвечающий за виртуальный хост:
ServerAdmin creator@creator.su
DocumentRoot "/home/creator/Не разобранное"
ServerName creator.vernet.eu.org
ErrorLog "/home/creator/Не разобранное/.errorslog"
CustomLog "/home/creator/Не разобранное/.customlog" common
AddDefaultCharset utf-8
</VirtualHost>
index-файла в корне нет, .htaccess тоже. Отражается просто список файлов. Проблема в том, что в заголовках приходит кодировка ISO-8859-1, а имена файлов у меня в UTF.
Единственное, что смог придумать - написать php-скрипт, который будет считывать имена файлов и выдавать правильную кодировку, но это займёт много времени. Можно как-нибудь быстрее с этим разобраться?
Разбирайтся почему. По дефолту Апач сам кодировку не приписывает. Смотри какие заголовки посылает твой сервер.
Про заголовки я написал, так как 4 разных браузера (Opera, FF, IE, Epiphany) показали одну и ту же неверную кодировку. Или это как-то связано со спецификациями?
Про заголовки я написал, так как 4 разных браузера (Opera, FF, IE, Epiphany) показали одну и ту же неверную кодировку. Или это как-то связано со спецификациями?
Более подробной информации чем снифер дать ни кто не может. Можно весь пакет рассмотреть вплоть до канального уровня.
Но тебе больше подойдет FireBug плагин для FF. Имхо, лучшая штука в своем классе (но и под другие браузеры аналоги есть).
Касательно кодировки, подозреваю, что в META страницы у тебя написано одно, а в HTTP заголовках другое.
Не очевидные истины. Meta тег против HTTP header. Кто кого?
Ищи другой mod_autoindex.so или правть этот.
С чего ты решил, что имена файлов у тебя в UTF кодировке? Кодировка в которой записан сам файл, и кодировка в которой храниться имя этого файла в фс это разные вещи.
По идее autoindex автоматом распознает такие вещи. У меня ни на виндах, ни на никсах такой проблемы ни когда не возникало.
А там просто нечего настраивать, т.к. модуль использует результат вывода ls (никсы) или dir (винда) команд.
Ну вообще-то не так, там используются системные вызовы для перечисления фалов в каталоге, но мысль передана правильно.
Пусть системные, принцип тот же, что и для данных команд. Главное, что модуль работает напрямую с фс.
Во-первых, локаль системы ru-ru.utf-8, во-вторых, если ручками указать кодировку utf-8 в браузере, всё станет видно, в-третьих, скрипт написан и работает как надо. А как и на что это в моём случае может повлиять?
А не напрямую это как? :)
А не напрямую можно было бы парсить ответ ls или dir-а. IPC типа :D
Ну тогда я не понимаю.
Просто снала я ошибся подумав, что модуль использует результат вывода ls или dir. Просто невнимательно прочел. А как оказывается не юзает он их вовсе, а работает с фс. Какие точно там системные файловые вызовы используют хз, нужно смотреть исходник.
Но в принципе тоже самое можно было организовать через парсинг ответа ls или dir-а.
В общем по ходу действительно вечерком нужно исходники порыть....
ну или как-то так называется.
Посмотрел я и сходник (версии 2.2.3). Как я понимаю апач работает с фс напрямую получая данные в utf-8 формате.
#if APR_HAS_UNICODE_FS
ap_set_content_type(r, "text/html;charset=utf-8");
#else
ap_set_content_type(r, "text/html");
Но так получается на виндошной системе. На линях и юнихе кодировка не указывается.
Это даже приводит к XSS уязвимости: http://securityvulns.ru/Rdocument995.html .
Решение: обновиться до 2.2.6 версии: http://www.apache.org/dist/httpd/CHANGES_2.2.6
mod_autoindex: Add in Type and Charset options to IndexOptions
directive. This allows the admin to explicitly set the
content-type and charset of the generated page and is therefore
a viable workaround for buggy browsers affected by CVE-2007-4465
(cve.mitre.org).
Т.е. прописывание в .htaccess в данной директории опции:
IndexOptions Charset=UTF-8
должно изменить ситуацию (хотя бы в плане отдаваемого HTTP заголовка).
Опция помогла, спасибо большое! :)
Опция помогла, спасибо большое! :)
Так опцию добавили еще чуть ли не с 2.0 версии, поэтому резона ставить 2.2.6 просто нет. Просто XSS уязвимость пофиксена именно с этой версии.
Все там есть. Просто зависит от того какую ветку используете. В Etch скорее всего действительно нет, а в testing уже 2.2.8 есть. Вот например как оно стоит у меня