Модуль 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).
| Синтаксис: | override_charset on | off ; |
|---|---|
| Умолчание: | |
| Контекст: | http , server , location , if в location |
Определяет, выполнять ли перекодирование для ответов, полученных от проксированного сервера или от FastCGI/uwsgi/SCGI/gRPC-сервера, если в ответах уже указана кодировка в поле “Content-Type” заголовка ответа. Если перекодирование разрешено, то в качестве исходной кодировки используется кодировка, указанная в полученном ответе.
| Синтаксис: | source_charset кодировка ; |
|---|---|
| Умолчание: | — |
| Контекст: | http , server , location , if в location |
Задаёт исходную кодировку ответа. Если эта кодировка отличается от указанной в директиве charset, то выполняется перекодирование.
nginx не хочет работать с файлами, названия которых с русскими символами
Установил систему тикетов trac. Установил так: бакэнд apache+mod_wsgi на 8080 порту + nginx на 80 порту. Апач настроен так:
nginx настроен так:


Какая локаль системная и локаль файловой системы?
charset utf-8; # можно поместить в http, server, location, if in location

логи с ошибкой пишет только nginx:

локали что для пользователя root, что для пользователя www-data:
mod_wsgi ненужен. есть же православный uwsgi

charset utf-8; # не помог (
а ты рестартнул нжыныкс после внесения изменений в конфиг?

Проблема началась с переносом настроенной системы на новый сервер. Настройки со старого сервера (sites-avalible) я перенес один-в-один, все настройки старого сервера не могу посмотреть.
nginx и кириллица в строке запроса (rewrite)
Подскажите, как научить nginx переваривать кириллицу в строке запроса (GET)?
В частности запрос сервер получает через rewrite условие в собственном конфиге:
rewrite ^/kastingi_v_moskve_(.*) /index.php?action=castings&co=3159&ci=москва&p=$1 last;
без кириллицы работает.
Читал в доках, что надо установить кодировку в UTF-8
Но прописывание в
Если у вас есть опыт подобных манипуляций, поделитесь пожалуйста.
И ещё околотемный вопрос: у Апача можно перекинуть пользователя перманентным редиректом (302) на другой домен
Nginx, Opencart проблема с кириллицей в route=product/search
Моя голова уже вся сломалась на раздумьях о том, почему не проходит запрос в product/search на кириллице.
Opencart 2 на nginx + php-fpm.
Вбиваю русское слово в строку поиска (или прямо в адресную строку в /index.php?route=product/search&search=слово). Русское слово кодируется методом URIencode, например "погрузчик" -> "%D0%BF%D0%BE%D0%B3%D1%80%D1%83%D0%B7%D1%87%D0%B8%D0%BA"
Идет запрос /index.php?route=product/search&search=%D0%BF%D0%BE%D0%B3%D1%80%D1%83%D0%B7%D1%87%D0%B8%D0%BA
В этой строке почему то последовательности "%8?" подменяются на "_" (посмотрела в логах), соответственно, запрос превращается в /search/?search=%D0%BF%D0%BE%D0%B3%D1_%D1_%D0%B7%D1_%D0%B8%D0%BA
При раскодировании получается пустая строка, которая отправляется в базу данных, поиск ничего не находит.
Запросы на английском языке — работают. Запросы на русском языке — работают, если закодированное слово не содержит последовательностей "%8?", например, запрос "мини" пройдет.
Статические страницы с кириллицей (которые без route) — работают. На локали на http — все работает.
