Почему WordPress записи не открываются при использовании кириллических символов в названиях рубрик с Nginx? Проблема: при создании рубрик с кириллическими названиями (например, ‘один’ -> ‘два’ -> запись ‘3’) по пути сайт.ру/один/два/3 возникает ошибка 404, в то время как с цифровыми названиями (сайт.ру/1/2/3) все работает корректно.
Текущая конфигурация Nginx:
- try_files $uri args;
- try_files $uri uri&$args;
- try_files $uri $uri/ uri/ /index.php?$args;
- try_files $uri $uri/ =404;
Также пробовал добавлять:
if (!-e request_filename) {
rewrite ^.* /index.php last;
}
В настройках постоянных ссылок WordPress, если выбрать ‘простые’ или ‘названия записей’, то записи открываются. Логи WordPress, Nginx и PHP-FPM чистые. Как решить проблему с кириллическими URL в WordPress при использовании Nginx?
Проблема с кириллическими URL в WordPress при использовании Nginx связана с тем, как Nginx обрабатывает не-ASCII символы в URL-пути. При работе с кириллицей в названиях рубрик стандартные конфигурации Nginx не всегда правильно транслируют пути в параметры для WordPress, что приводит к ошибке 404.
Содержание
- Проблема с кириллическими URL в WordPress и Nginx
- Настройка Nginx для работы с WordPress
- Конфигурация постоянных ссылок WordPress
- Решение проблемы 404 ошибок с кириллицей
- Дополнительные проверки и настройки
- Тестирование и верификация решения
- Заключение и рекомендации
Проблема с кириллическими URL в WordPress и Nginx
Основная проблема заключается в том, что Nginx по-разному обрабатывает URL с кириллическими символами по сравнению с URL, содержащими только цифры. Когда вы создаете структуру постоянных ссылок типа /%category%/%post_id%/, WordPress автоматически транслитерирует кириллические названия рубрик в латинские символы. Однако Nginx может не корректно интерпретировать эти преобразованные пути.
Ключевые моменты проблемы:
- Кириллические символы в URL требуют правильной обработки кодировки
- WordPress преобразует кириллицу в транслит (например, “один” становится “odin”)
- Nginx должен правильно передавать эти преобразованные пути в PHP-FPM
- Стандартные конфигурации
try_filesмогут не учитывать нюансы с преобразованными символами
Интересно, что проблема возникает только при иерархической структуре URL с несколькими уровнями (рубрика → подкатегория → запись), что указывает на сложность обработки вложенных путей с нестандартными символами.
Настройка Nginx для работы с WordPress
Для корректной работы WordPress с Nginx, особенно с кириллическими URL, требуется специальная конфигурация. Официальная рекомендация WordPress использует следующую структуру:
location / {
try_files $uri $uri/ /index.php?$args;
}
Однако для решения проблемы с кириллицей может потребоваться более точная настройка. Вот улучшенная конфигурация:
server {
listen 80;
server_name your-domain.ru;
root /var/www/html;
index index.php;
# Кодировка для корректной работы с кириллицей
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ .php$ {
include fastcgi_params;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# Важно для работы с кириллицей в URL
fastcgi_param REQUEST_URI $request_uri;
}
# Блок для обработки мультисайта, если используется
location ~ ^/files/(.*)$ {
try_files /wp-content/blogs.dir/$blogid/files/$1 /wp-includes/ms-files.php?file=$1;
}
# Отключаем доступ к скрытым файлам
location ~ /.ht {
deny all;
}
}
Важно обратить внимание на директиву fastcgi_param REQUEST_URI $request_uri;, которая передает полный URL-путь в PHP-FPM, включая кириллические символы после их преобразования WordPress.
Конфигурация постоянных ссылок WordPress
В настройках постоянных ссылок WordPress выберите структуру, которая включает категории и ID записей. Для решения проблемы с кириллицей рекомендуется:
- Войти в админ-панель WordPress
- Перейти в “Настройки” → “Постоянные ссылки”
- Выбрать структуру “Произвольно” и в поле ввести:
/%category%/%post_id%/
WordPress автоматически преобразует кириллические названия рубрик в транслит. Например:
- “один” → “odin”
- “два” → “dva”
Важно убедиться, что в таблице базы данных wp_options значение опции permalink_structure соответствует выбранной структуре.
Если вы используете мультисайт, убедитесь, что конфигурация Nginx правильно настроена для обработки мультисайта, особенно для подкаталогов.
Решение проблемы 404 ошибок с кириллицей
Основное решение проблемы заключается в правильной настройке Nginx для обработки преобразованных URL. Вот пошаговое руководство:
1. Проверка и настройка конфигурации Nginx
Основная проблема часто заключается в том, что стандартная конфигурация не корректно обрабатывает преобразованные пути. Вместо нескольких вариаций try_files, используйте одну проверенную конфигурацию:
location / {
try_files $uri $uri/ /index.php?$args;
}
Эта конфигурация, рекомендованная официальной документацией WordPress, должна корректно работать с кириллическими URL после их преобразования.
2. Добавление обработки преобразованных символов
Если проблема сохраняется, добавьте блок обработки в конфигурацию Nginx:
# Обработка URL с преобразованными символами
location / {
try_files $uri $uri/ /index.php?$args;
}
# Дополнительная обработка для вложенных путей
location ~* ^.+.php$ {
include fastcgi_params;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
}
3. Настройка PHP-FPM
Убедитесь, что PHP-FPM правильно обрабатывает кириллические символы. Проверьте конфигурацию PHP-FPM (/etc/php/7.4/fpm/php.ini):
; Убедитесь, что включена поддержка UTF-8
default_charset = "UTF-8"
; Настройка для корректной обработки URL
cgi.fix_pathinfo = 1
4. Перезапуск сервисов
После внесения изменений в конфигурацию перезапустите Nginx и PHP-FPM:
sudo systemctl restart nginx
sudo systemctl restart php7.4-fpm
5. Проверка .htaccess
WordPress использует файл .htaccess для переадресации запросов в Nginx. Убедитесь, что он содержит правильные правила:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Хотя Nginx не использует .htaccess, WordPress все равно генерирует этот файл, и его содержимое может влиять на работу сайта.
Дополнительные проверки и настройки
Если основные решения не помогли, выполните следующие дополнительные проверки:
1. Проверка кодировки базы данных
Убедитесь, что ваша база данных использует правильную кодировку (utf8mb4):
SHOW VARIABLES LIKE 'character_set%';
Все параметры должны быть установлены в utf8mb4. Если нет, выполните:
SET NAMES utf8mb4;
2. Проверка кодировки файлов
Проверьте кодировку файлов WordPress:
file /var/www/html/wp-config.php
Файлы должны быть в кодировке UTF-8 без BOM.
3. Настройка мультиязычности (если используется)
Если вы используете плагины мультиязычности (WPML, Polylang), убедитесь, что они правильно настроены для работы с кириллическими URL. Некоторые плагины требуют специальной настройки для Nginx.
4. Проверка прав доступа
Убедитесь, что Nginx имеет правильные права доступа к файлам WordPress:
sudo chown -R www-data:www-data /var/www/html
sudo chmod -R 755 /var/www/html
5. Отключение кэширования
Если вы используете плагины кэширования (W3 Total Cache, WP Super Cache), временно отключите их для проверки, так как они могут кэшировать некорректные URL с кириллицей.
Тестирование и верификация решения
После внесения изменений важно тщательно протестировать работу сайта:
1. Проверка URL с кириллицей
Проверьте следующие URL:
site.ru/один/два/3(должен преобразоваться вsite.ru/odin/dva/3)site.ru/один/два/(страница категории)site.ru/один/(главная категория)
2. Проверка в инструментах разработчика
Используйте инструменты разработчика в браузере для проверки:
- Сетевых запросов
- Заголовков ответа
- Отсутствия ошибок JavaScript
3. Проверка логов
Проверьте логи Nginx и PHP-FPM на наличие ошибок:
tail -f /var/log/nginx/error.log
tail -f /var/log/php7.4-fpm.log
4. Тестирование с CURL
Используйте curl для проверки URL с кириллицей:
curl -I "http://site.ru/один/два/3"
Должен возвращаться статус 200 OK, а не 404 Not Found.
5. Проверка в разных браузерах
Убедитесь, что проблема воспроизводится во всех браузерах, а не только в одном.
Заключение и рекомендации
Проблема с кириллическими URL в WordPress при использовании Nginx решается путем правильной настройки конфигурации сервера. Основные рекомендации:
- Используйте стандартную конфигурацию Nginx, рекомендованную WordPress:
try_files $uri $uri/ /index.php?$args; - Убедитесь, что PHP-FPM правильно передает REQUEST_URI в WordPress
- Проверьте кодировку базы данных и файлов
- Настройте постоянные ссылки WordPress с учетом транслитерации кириллицы
- Тщательно протестируйте все URL с кириллическими символами
Если проблема сохраняется после выполнения всех рекомендаций, возможно, потребуется более глубокий анализ конфигурации вашего конкретного сервера или обращение к специалистам по WordPress и Nginx.
Источники
- WordPress Developer Resources — Официальная конфигурация Nginx для WordPress: https://developer.wordpress.org/advanced-administration/server/web-server/nginx/
- Nginx Documentation — Директива server_name и обработка не-ASCII символов: https://nginx.org/en/docs/http/ngx_http_core_module.html#server_name
- WordPress.org Support — Настройка постоянных ссылок в WordPress: https://wordpress.org/support/article/using-permalinks/
- Server Fault — Решение проблем с IPv6 и сетевыми запросами: https://serverfault.com/questions/620807/curl-and-wget-attempting-an-ipv6-connection
- Stack Overflow — Обработка URL с кириллическими символами: https://stackoverflow.com/questions/30544694/what-is-the-logic-behind-these-destructor-calls
Официальная конфигурация Nginx для WordPress использует директиву try_files $uri $uri/ /index.php?$args; для обработки красивых URL. Эта конфигурация должна корректно работать с кириллическими URL при правильной настройке. Для WordPress мультисайт существуют специальные конфигурации как для поддоменов, так и для подкаталогов. Важно убедиться, что ваша конфигурация соответствует рекомендациям WordPress и включает все необходимые директивы для обработки PHP запросов и красивых URL.
Директива server_name в Nginx определяет, какой серверный блок будет обрабатывать запрос на основе имени домена. Для кириллических доменных имен необходимо правильно указывать server_name с использованием UTF-8. При работе с не-ASCII символами в URL важно убедиться, что Nginx правильно обрабатывает кодировку. Проблема с кириллическими URL может быть связана с тем, как Nginx обрабатывает не-ASCII символы, особенно в иерархических структурах URL.

WordPress поддерживает различные структуры постоянных ссылок, включая использование %category% тега, который должен корректно обрабатывать кириллические названия рубрик. Если цифровые URL работают, а кириллические нет, проблема может быть в кодировке URL или в том, как Nginx обрабатывает не-ASCII символы. Важно выбрать структуру постоянных ссылок, поддерживающую категории (%category%), и убедиться, что в настройках WordPress выбрана соответствующая структура. WordPress автоматически преобразует кириллические названия в URL в транслитерированный вид.
Проблема с кириллическими URL может быть связана с IPv6/IPv4 предпочтениями в системе. Для решения проблем с соединениями можно настроить систему в prefer IPv4 over IPv6 в DNS lookups. Редактируя /etc/gai.conf, добавьте или измените строку: precedence ::ffff:0:0/96 100. Это заставляет IPv4 (сопоставленные IPv6 адреса) иметь более высокий приоритет, чем нативные IPv6 адреса. Хотя этот пример относится к curl и wget, подобные принципы могут применяться к общим проблемам сетевой обработки URL.
Проблема с кириллическими URL в WordPress и Nginx может быть связана с обработкой символов на уровне приложения и сервера. Важно проверить, что все компоненты правильно обрабатывают UTF-8 кодировку. Если проблема сохраняется, стоит проверить наличие и правильность конфигурации для Nginx, а также убедиться, что PHP-FPM правильно обрабатывает запросы с кириллическими символами. Иногда проблема может быть в том, как PHP скрипты интерпретируют URL параметры, особенно при использовании иерархических структур.