koltykov
@koltykov

UTF8 BOM или Как NGINX определяет кодировку файла?

Вчера столкнулся с очень интересной проблемой при работе с nginx, над которой мы ломали голову часа 3.
В общем имеется сайт, где все уже довольно давно работает в кодировке UTF-8.
Основной сайт на русском языке: domain.com
И есть небольшая англ. версия на поддомене en.domain.com
Во всех файлах прописан meta кодировки UTF-8, ну и сами файлы естественно сохранены в UTF-8.
На англ. версию на поддомене en.domain.com понадобилось вывести русский текст и тут вдруг обнаружилось, что выводится крякозябры. Начали смотреть ответ сервера от nginx, а он выводит кодировку windows-1251. Что только не делали - в конфиге nginx задавали принудительно кодировку UTF-8, прописывали header в PHP и т.д. Хоть убей выдает в win1251.
Самое интересное, что при обращении по адресу domain.com/en - выдавал нормальную кодировку. Конфиги для domain.com и en.domain.com - одинаковые.
Проблему локализовали - в функции ob_start. Как только ее комментируем - все ок. Раскомментируем - крякозябры.
В общем долго гуглили - пробовали разные варианты с ob - clean, flush, отключением gzip и т.д. - ничего не помогло.
Пока не пришла идея сохранить подключаемый файл где вызывается ob_start с ВОМ. После этого все встало нормально.
Т.е. получается что nginx определяет кодировку файла в utf-8 он или нет по BOM-записи? И почему принудительное указание кодировки в конфиге nginx не работает?
  • Вопрос задан
  • 4036 просмотров
Пригласить эксперта
Ответы на вопрос 3
@Fly3110
web developer
nginx не передает кодировку, он передает данные. В заголовках может содержаться указание на то, какую кодировку использовать. А вот как отображать эти данные - решает принимающая сторона, например браузер.
Ответ написан
Комментировать
koltykov
@koltykov Автор вопроса
Fly3110
Вот заголовки с en.domain.com:
099374f5ebe1447ebd44f61f1fc7f9b2.png
А вот этот же скрипт вызывается без указания поддомена:
a1ff225c5a604a898db4dfb27df374c8.png
Почему в первом случае мы видим явное указание кодировки windows-1251? Кто ее прописывает NGINX или PHP5-FPM?
А как тут влияет BOM и ob_start()?
Ответ написан
@Power
Попробуйте посмотреть, какие заголовки приходят и в какой кодировке результат, сделав запрос:
1) к nginx-у прямо с сервера, где стоит nginx;
2) напрямую к бэкэнду с сервера, где стоит nginx.
Как-то так:
curl -sS --include --location --output result.html 'http://domain.com/'

Тогда вы сможете определить, кто виноват: бэкэнд, nginx или кто-то третий (прокси между nginx-ом и вашим браузером).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы