Как удалить/заменить кодировку charset=iso-8859-1 в 30X редиректах Apache и страницах ошибок на utf-8

Настраивая всевозможные редиректы многие сталкиваются со странной особенностью Apache — сервер плевать хотел на ваши директивы AddDefaultCharset, AddCharset установленные в UTF-8 и на редиректах 301/302 упорно возвращает Content-Type: text/html; charset=iso-8859-1 вместо ожидаемого utf-8.

Вот что сказано по этому случаю в документации Apache:

Когда Apache выдает перенаправление в ответ на запрос клиента, ответ включает в себя некоторый фактический текст, который будет отображаться в случае, если клиент не может  автоматически выполнить перенаправление. Обычно Apache маркирует этот текст в соответствии с используемым набором символов, которым является ISO-8859-1.

Т.е. такое поведение и кодировку сервер нам «подсовывает» по умолчанию. Там же указано, что в некоторых старых браузерах это может привести к ошибке распознавания кодировки на конечной странице. Это поведение кодировки можно подавить установкой переменной среды suppress-error-charset и мы получим заголовок следующего вида: Content-Type: text/html в котором будет отсутствовать кодировка.

А если вы получаете страницы 40x-50x ошибок в кодировке iso-8859-1, то вероятнее всего они у вас просто отсутствуют как таковые и не заданы директивами ErrorDocument в конфигах Apache или локальном htaccess. Т.е. получаете стандартную заглушку в стандартной кодировке. Иначе страницы ошибок будут возвращены в той кодировке, которая настроена по умолчанию.

Подведём итог: давить или не давить кодировку ошибок, и создавать ли собственные страницы ошибок, решать вам, но я бы советовал просто забить. Цель этой статьи — чтобы вы не потратили пол дня на установление причин почему ваш Apache «работает неправильно». Я например, обычно сношу все страницы, создаваемые панельками сервера и в собственных страницах ошибок не вижу никакого смысла, кроме 404, и то, она уже генерируется движком сайта, а не конфигами.

P.S.: стало интересно поведение nginx в данном контексте при переадресациях. И вот:

Nginx не ставит этой странице никаких кодировок по умолчанию, а также не возвращает вспомогательную ссылку The document has moved here, что собственно и правильно.

Оставить комментарий

Ваш адрес email не будет опубликован.