Веб

Настройка Nginx для WordPress с кириллическими URL: решение ошибки 404

Пошаговое руководство по решению проблемы с кириллическими URL в WordPress при использовании Nginx. Конфигурация сервера и настройка постоянных ссылок.

6 ответов 1 просмотр

Почему WordPress записи не открываются при использовании кириллических символов в названиях рубрик с Nginx? Проблема: при создании рубрик с кириллическими названиями (например, ‘один’ -> ‘два’ -> запись ‘3’) по пути сайт.ру/один/два/3 возникает ошибка 404, в то время как с цифровыми названиями (сайт.ру/1/2/3) все работает корректно.

Текущая конфигурация Nginx:

  1. try_files $uri uri//index.php?uri/ /index.php?args;
  2. try_files $uri uri//index.php?q=uri/ /index.php?q=uri&$args;
  3. try_files $uri $uri/ uri/uri/uri/ /index.php?$args;
  4. 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.


WordPress Nginx configuration diagram

Содержание


Проблема с кириллическими 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 использует следующую структуру:

nginx
location / {
 try_files $uri $uri/ /index.php?$args;
}

Однако для решения проблемы с кириллицей может потребоваться более точная настройка. Вот улучшенная конфигурация:

nginx
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 выберите структуру, которая включает категории и ID записей. Для решения проблемы с кириллицей рекомендуется:

  1. Войти в админ-панель WordPress
  2. Перейти в “Настройки” → “Постоянные ссылки”
  3. Выбрать структуру “Произвольно” и в поле ввести: /%category%/%post_id%/

WordPress автоматически преобразует кириллические названия рубрик в транслит. Например:

  • “один” → “odin”
  • “два” → “dva”

Важно убедиться, что в таблице базы данных wp_options значение опции permalink_structure соответствует выбранной структуре.

Если вы используете мультисайт, убедитесь, что конфигурация Nginx правильно настроена для обработки мультисайта, особенно для подкаталогов.

Решение проблемы 404 ошибок с кириллицей

Основное решение проблемы заключается в правильной настройке Nginx для обработки преобразованных URL. Вот пошаговое руководство:

1. Проверка и настройка конфигурации Nginx

Основная проблема часто заключается в том, что стандартная конфигурация не корректно обрабатывает преобразованные пути. Вместо нескольких вариаций try_files, используйте одну проверенную конфигурацию:

nginx
location / {
 try_files $uri $uri/ /index.php?$args;
}

Эта конфигурация, рекомендованная официальной документацией WordPress, должна корректно работать с кириллическими URL после их преобразования.

2. Добавление обработки преобразованных символов

Если проблема сохраняется, добавьте блок обработки в конфигурацию Nginx:

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):

ini
; Убедитесь, что включена поддержка UTF-8
default_charset = "UTF-8"
; Настройка для корректной обработки URL
cgi.fix_pathinfo = 1

4. Перезапуск сервисов

После внесения изменений в конфигурацию перезапустите Nginx и PHP-FPM:

bash
sudo systemctl restart nginx
sudo systemctl restart php7.4-fpm

5. Проверка .htaccess

WordPress использует файл .htaccess для переадресации запросов в Nginx. Убедитесь, что он содержит правильные правила:

apache
# 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):

sql
SHOW VARIABLES LIKE 'character_set%';

Все параметры должны быть установлены в utf8mb4. Если нет, выполните:

sql
SET NAMES utf8mb4;

2. Проверка кодировки файлов

Проверьте кодировку файлов WordPress:

bash
file /var/www/html/wp-config.php

Файлы должны быть в кодировке UTF-8 без BOM.

3. Настройка мультиязычности (если используется)

Если вы используете плагины мультиязычности (WPML, Polylang), убедитесь, что они правильно настроены для работы с кириллическими URL. Некоторые плагины требуют специальной настройки для Nginx.

4. Проверка прав доступа

Убедитесь, что Nginx имеет правильные права доступа к файлам WordPress:

bash
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 на наличие ошибок:

bash
tail -f /var/log/nginx/error.log
tail -f /var/log/php7.4-fpm.log

4. Тестирование с CURL

Используйте curl для проверки URL с кириллицей:

bash
curl -I "http://site.ru/один/два/3"

Должен возвращаться статус 200 OK, а не 404 Not Found.

5. Проверка в разных браузерах

Убедитесь, что проблема воспроизводится во всех браузерах, а не только в одном.

Заключение и рекомендации

Проблема с кириллическими URL в WordPress при использовании Nginx решается путем правильной настройки конфигурации сервера. Основные рекомендации:

  1. Используйте стандартную конфигурацию Nginx, рекомендованную WordPress: try_files $uri $uri/ /index.php?$args;
  2. Убедитесь, что PHP-FPM правильно передает REQUEST_URI в WordPress
  3. Проверьте кодировку базы данных и файлов
  4. Настройте постоянные ссылки WordPress с учетом транслитерации кириллицы
  5. Тщательно протестируйте все URL с кириллическими символами

Если проблема сохраняется после выполнения всех рекомендаций, возможно, потребуется более глубокий анализ конфигурации вашего конкретного сервера или обращение к специалистам по WordPress и Nginx.


Источники

  1. WordPress Developer Resources — Официальная конфигурация Nginx для WordPress: https://developer.wordpress.org/advanced-administration/server/web-server/nginx/
  2. Nginx Documentation — Директива server_name и обработка не-ASCII символов: https://nginx.org/en/docs/http/ngx_http_core_module.html#server_name
  3. WordPress.org Support — Настройка постоянных ссылок в WordPress: https://wordpress.org/support/article/using-permalinks/
  4. Server Fault — Решение проблем с IPv6 и сетевыми запросами: https://serverfault.com/questions/620807/curl-and-wget-attempting-an-ipv6-connection
  5. 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.org / Система управления контентом

WordPress поддерживает различные структуры постоянных ссылок, включая использование %category% тега, который должен корректно обрабатывать кириллические названия рубрик. Если цифровые URL работают, а кириллические нет, проблема может быть в кодировке URL или в том, как Nginx обрабатывает не-ASCII символы. Важно выбрать структуру постоянных ссылок, поддерживающую категории (%category%), и убедиться, что в настройках WordPress выбрана соответствующая структура. WordPress автоматически преобразует кириллические названия в URL в транслитерированный вид.

A

Проблема с кириллическими URL может быть связана с IPv6/IPv4 предпочтениями в системе. Для решения проблем с соединениями можно настроить систему в prefer IPv4 over IPv6 в DNS lookups. Редактируя /etc/gai.conf, добавьте или измените строку: precedence ::ffff:0:0/96 100. Это заставляет IPv4 (сопоставленные IPv6 адреса) иметь более высокий приоритет, чем нативные IPv6 адреса. Хотя этот пример относится к curl и wget, подобные принципы могут применяться к общим проблемам сетевой обработки URL.

M

Проблема с кириллическими URL в WordPress и Nginx может быть связана с обработкой символов на уровне приложения и сервера. Важно проверить, что все компоненты правильно обрабатывают UTF-8 кодировку. Если проблема сохраняется, стоит проверить наличие и правильность конфигурации для Nginx, а также убедиться, что PHP-FPM правильно обрабатывает запросы с кириллическими символами. Иногда проблема может быть в том, как PHP скрипты интерпретируют URL параметры, особенно при использовании иерархических структур.

Авторы
A
Пользователь
M
Разработчик ПО
Источники
Веб-сервер
WordPress.org / Система управления контентом
Система управления контентом
Проверено модерацией
НейроОтветы
Модерация