- Модуль ngx_http_charset_module
- Пример конфигурации
- Директивы
- Почему nginx отдает неверный заголовок ответа charset?
- Module ngx_http_charset_module
- Example Configuration
- Directives
- NGINX | Проблема с кодировкой
- Кодировка windows 1251 в сайтостроении
- Кодировка windows 1251 в html
- Кодировка windows 1251 в PHP
- Кодировка windows 1251 в htaccess
Модуль ngx_http_charset_module
Модуль ngx_http_charset_module добавляет указанную кодировку в поле “Content-Type” заголовка ответа. Кроме того, модуль может перекодировать данные из одной кодировки в другую с некоторыми ограничениями:
- перекодирование осуществляется только в одну сторону — от сервера к клиенту,
- перекодироваться могут только однобайтные кодировки
- или однобайтные кодировки в UTF-8 и обратно.
Пример конфигурации
Директивы
Синтаксис: | charset кодировка | off ; |
---|---|
Умолчание: | |
Контекст: | http , server , location , if в location |
Добавляет указанную кодировку в поле “Content-Type” заголовка ответа. Если эта кодировка отличается от указанной в директиве source_charset, то выполняется перекодирование.
Параметр off отменяет добавление кодировки в поле “Content-Type” заголовка ответа.
Кодировка может быть задана с помощью переменной:
В этом случае необходимо, чтобы все возможные значения переменной присутствовали хотя бы один раз в любом месте конфигурации в виде директив charset_map, charset или source_charset. Для кодировок utf-8 , windows-1251 и koi8-r для этого достаточно включить в конфигурацию файлы conf/koi-win , conf/koi-utf и conf/win-utf . Для других кодировок можно просто сделать фиктивную таблицу перекодировки, например:
Кроме того, кодировка может быть задана в поле “X-Accel-Charset” заголовка ответа. Эту возможность можно запретить с помощью директив proxy_ignore_headers, fastcgi_ignore_headers, uwsgi_ignore_headers, scgi_ignore_headers и grpc_ignore_headers.
Синтаксис: | charset_map кодировка1 кодировка2 < . > |
---|---|
Умолчание: | — |
Контекст: | http |
Описывает таблицу перекодирования из одной кодировки в другую. Таблица для обратного перекодирования строится на основании тех же данных. Коды символов задаются в шестнадцатеричном виде. Неописанные символы в пределах 80-FF заменяются на “ ? ”. При перекодировании из UTF-8 символы, отсутствующие в однобайтной кодировке, заменяются на “ &#XXXX; ”.
При описании таблицы перекодирования в UTF-8, коды кодировки UTF-8 должны быть указаны во второй колонке, например:
Полные таблицы преобразования из koi8-r в windows-1251 и из koi8-r и windows-1251 в utf-8 входят в дистрибутив и находятся в файлах conf/koi-win , conf/koi-utf и conf/win-utf .
Синтаксис: | charset_types mime-тип . ; |
---|---|
Умолчание: | |
Контекст: | http , server , location |
Эта директива появилась в версии 0.7.9.
Разрешает работу модуля в ответах с указанными MIME-типами в дополнение к “ text/html ”. Специальное значение “ * ” соответствует любому MIME-типу (0.8.29).
До версии 1.5.4 по умолчанию вместо MIME-типа “ application/javascript ” использовался “ application/x-javascript ”.
Синтаксис: | override_charset on | off ; |
---|---|
Умолчание: | |
Контекст: | http , server , location , if в location |
Определяет, выполнять ли перекодирование для ответов, полученных от проксированного сервера или от FastCGI/uwsgi/SCGI/gRPC-сервера, если в ответах уже указана кодировка в поле “Content-Type” заголовка ответа. Если перекодирование разрешено, то в качестве исходной кодировки используется кодировка, указанная в полученном ответе.
Необходимо отметить, что если ответ был получен в подзапросе, то, независимо от значения директивы override_charset , всегда выполняется перекодирование из кодировки ответа в кодировку основного запроса.
Синтаксис: | source_charset кодировка ; |
---|---|
Умолчание: | — |
Контекст: | http , server , location , if в location |
Задаёт исходную кодировку ответа. Если эта кодировка отличается от указанной в директиве charset, то выполняется перекодирование.
Почему nginx отдает неверный заголовок ответа charset?
В настройках виртуального сервера nginx задана кодировка:
Но сервер отдает неверный заголовок ответа — utf-8
macbook$ curl -I example.dev
HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Wed, 02 Dec 2015 12:13:51 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.6.16
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Может быть кто-то сталкивался с аналогичной ситуацией?
- Вопрос задан более трёх лет назад
- 6878 просмотров
default_charset string
В PHP 5.6 и новее «UTF-8» является значением по умолчанию и используется как кодировка по умолчанию для функций htmlentities(), html_entity_decode() и htmlspecialchars(), если параметр encoding не указан. Значение default_charset также используется для указания кодировки по умолчанию для функций iconv, если конфигурационные опции iconv.input_encoding, iconv.output_encoding и iconv.internal_encoding не установлены, и для функций mbstring, если не установлены mbstring.http_input mbstring.http_output mbstring.internal_encoding.
Все версии PHP используют это значение как кодировку для стандартного заголовка Content-Type, отправляемого PHP, если этот заголовок не переопределен вызовом функции header().
Не рекомендуется устанавливать default_charset в пустое значение
А раз не рекомендуется значит в самих скриптах через header менять charset
header(‘Content-Type: text/html; charset=windows-1251’);
Module ngx_http_charset_module
The ngx_http_charset_module module adds the specified charset to the “Content-Type” response header field. In addition, the module can convert data from one charset to another, with some limitations:
- conversion is performed one way — from server to client,
- only single-byte charsets can be converted
- or single-byte charsets to/from UTF-8.
Example Configuration
Directives
Syntax: | charset charset | off ; |
---|---|
Default: | |
Context: | http , server , location , if in location |
Adds the specified charset to the “Content-Type” response header field. If this charset is different from the charset specified in the source_charset directive, a conversion is performed.
The parameter off cancels the addition of charset to the “Content-Type” response header field.
A charset can be defined with a variable:
In such a case, all possible values of a variable need to be present in the configuration at least once in the form of the charset_map, charset, or source_charset directives. For utf-8 , windows-1251 , and koi8-r charsets, it is sufficient to include the files conf/koi-win , conf/koi-utf , and conf/win-utf into configuration. For other charsets, simply making a fictitious conversion table works, for example:
In addition, a charset can be set in the “X-Accel-Charset” response header field. This capability can be disabled using the proxy_ignore_headers, fastcgi_ignore_headers, uwsgi_ignore_headers, scgi_ignore_headers, and grpc_ignore_headers directives.
Syntax: | charset_map charset1 charset2 < . > |
---|---|
Default: | — |
Context: | http |
Describes the conversion table from one charset to another. A reverse conversion table is built using the same data. Character codes are given in hexadecimal. Missing characters in the range 80-FF are replaced with “ ? ”. When converting from UTF-8, characters missing in a one-byte charset are replaced with “ &#XXXX; ”.
When describing a conversion table to UTF-8, codes for the UTF-8 charset should be given in the second column, for example:
Full conversion tables from koi8-r to windows-1251 , and from koi8-r and windows-1251 to utf-8 are provided in the distribution files conf/koi-win , conf/koi-utf , and conf/win-utf .
Syntax: | charset_types mime-type . ; |
---|---|
Default: | |
Context: | http , server , location |
This directive appeared in version 0.7.9.
Enables module processing in responses with the specified MIME types in addition to “ text/html ”. The special value “ * ” matches any MIME type (0.8.29).
Until version 1.5.4, “ application/x-javascript ” was used as the default MIME type instead of “ application/javascript ”.
Syntax: | override_charset on | off ; |
---|---|
Default: | |
Context: | http , server , location , if in location |
Determines whether a conversion should be performed for answers received from a proxied or a FastCGI/uwsgi/SCGI/gRPC server when the answers already carry a charset in the “Content-Type” response header field. If conversion is enabled, a charset specified in the received response is used as a source charset.
It should be noted that if a response is received in a subrequest then the conversion from the response charset to the main request charset is always performed, regardless of the override_charset directive setting.
Syntax: | source_charset charset ; |
---|---|
Default: | — |
Context: | http , server , location , if in location |
Defines the source charset of a response. If this charset is different from the charset specified in the charset directive, a conversion is performed.
NGINX | Проблема с кодировкой
Есть свежеустановленный сервер Gentoo AMD64.
Проблема заключается в следуйщем:
Есть cms который работает с mysql. База данных в кодировке UTF-8.
Сам сайт в кодировке windows-1255.
Весь HTML видно нормально, а все запросы к БД выводятся в закарючках.
Каким образом можно это решить?
алсо если сает на похэпэ (или чем у там) с виндо-еврейской кодировкой, а бд в расово верной утф-8, то это ниболта не проблема нжынкса
также хочу отметить что fpm более кошерный чем fcgi
пробывал выставлять кодировку через этот модуль. 0 результатов :/.
а причем тут вообще nginx, у вас с базой наверняка взаимодействие со стороны скриптов неккоректное, или в самой базе проблема, загляните в базу проверьте что там все нормально с кодировкой, сделайте проверочный запрос к ней, сделайте тоже самое из скрипта на сайте
> Есть cms который работает с mysql. База данных в кодировке UTF-8.
Сам сайт в кодировке windows-1255.
А теперь из этих двух строк угадай причину проблемы.
сайт на php с виндо-еврейской кодировкой. а бд в кошерной UTF-8.
на хосте с CentOS и апаче сайт пашет заебцом.
ты чо-то темнишь
когда делаю импорт, выбираю UTF-8.
а сами таблицы latin1_general_ci.
так.
значит charset windows-1255; в конфиге не помогает?
в выводимом html есть
. . ?
апач точно в win-1255 выдает?
В выводимом коде есть:
charset windows-1255; не помогает.
апач выдаёт в win-1255. во всяком случае если браузер не врёт.
Кодировка windows 1251 в сайтостроении
Кодировка windows 1251 была создана в начале 90 годов для русификации программных продуктов, выпускаемых корпорацией Microsoft :
- 0xFF (25510) – это код, который зарезервирован для символа «я». В программах, которые не поддерживают чистый 8-ой бит, часто возникают непредсказуемые проблемы;
- Нет псевдографики, которая присутствует в KOI8 , CP866 .
Ниже приведены символы из Code Page 1251 или сокращенно СР1251 ( числа под символами являются кодом в шестнадцатеричной системе такого же символа в Юникоде ):
Кодировка windows 1251 в html
Нередко у web-разработчиков и блогеров, обладающих различной квалификацией возникает проблема с кодировкой страниц: вместо подготовленного текста появляются неизвестные, нечитаемые символы. Чтобы разобраться с данной проблемой, необходимо понимать суть термина « кодировка страницы ».
Текст в памяти компьютера хранится в виде определенного количества байт, а не в том виде, в котором он отображается в текстовом редакторе. Каждый байт является кодом, который соответствует одному символу. Для того чтобы текст на странице отображался как следует, нужно сообщить браузеру, какую таблицу кодов для расшифровки и отображения он должен использовать.
Таблица кодировок не является универсальной, то есть, для расшифровки текста необходимо использовать ту, которая соответствует кодировке символов:
— между тегом и закрывающим его нужно прописать — исходя из этой строки, браузер будет использовать символы русского алфавита для отображения текста на странице.
Кодировка windows 1251 в PHP
Ни для кого не является тайной, что генерация страниц проходит путем выборки и использования какой-то части информации, которая хранится в базе данных. При написании сайта на PHP , чаще всего это mysql :
Для согласования расшифровки необходимо выполнить функцию mysql_query(«SET NAMES cp1251») – это означает, что преобразование из машинного кода будет осуществляться согласно таблице cp1251 .
Кодировка windows 1251 в htaccess
При создании сайта, предварительно настроив кодировки в шаблонах и базах данных, все равно может всплыть проблема некорректного отображения информации в браузере.
Для того чтобы для веб-ресурса была задана кодировка виндовс-1251 , необходимо найти ( или создать ) файл .htaccess . Это файл, который хранит в себе дополнительные настройки и описания конфигураций web-сервера.
В нем для установки кодировки следует прописать следующие строки:
- DefaultLanguage ru;
- AddDefaultCharset windows-1251;
- php_value default_charset «cp1251».
Таким образом, для корректного отображения текста должны совпадать его кодировка и таблица кодов, с помощью которой браузер будет расшифровывать символы. Для текстов, написанных на славянских языках, необходима win 1251 кодировка. Важно помнить, что элементы страниц и баз данных должны быть описаны с помощью одной таблицы кодов.