Как удалить/заменить кодировку 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 в котором будет отсутствовать кодировка.

SetEnvIf Host ^ suppress-error-charset

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

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

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

HTTP/1.1 301 Moved Permanently
Server: nginx/1.16.1
Date: Sat, 13 Feb 2021 11:14:48 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: https://example.com/

<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.16.1</center>
</body>
</html>

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

Оставить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *