- Статус
- Решено
- Заявлено для
- WPML Multilingual CMS 3.2.7
- Решено в
- 3.3
Обзор проблемы
При использовании языков в доменах и плагинов, чей вывод зависит от правильной фильтрации функции home_url(), подставляющей в ссылки нужную языковую версию URL-адреса главной страницы Вашего сайта, ссылки могут отображаться некорректно. В большинстве случаев это означает, что в ссылках используется версия Вашего домена для языка по умолчанию вместо правильной версии для дополнительного языка.
Другой частый пример проявления этой проблемы — XML-карты сайта Yoast WP SEO, которые некорректно отображаются на дополнительных языках, показывая просто белую страницу.
Сама проблема вызвана не плагином WPML, а разницей между веб-серверами Apache и Nginx. Веб-сервер Apache заполняет суперглобальную переменную $_SERVER['SERVER_NAME'] именем хоста, запрошенным браузерами. Nginx по умолчанию этого не делает, но его тоже можно соответствующим образом настроить.
Для этого в приведенном выше обходном решении просто используется переменная $host, предоставляемая веб-сервером Nginx, которая передается демону PHP-FPM, обрабатывающему Ваши файлы .php, через показанный выше вызов fastgi_param.
Затем демон PHP-FPM может использовать эту переменную через суперглобальную переменную $_SERVER, и такая настройка имитирует поведение по умолчанию более распространенной связки Apache + PHP(cgi).
Обходное решение
Найдите раздел, описывающий обработку файлов .php в конфигурационном файле nginx Вашего сайта.
Он будет похож на приведенный ниже пример и будет содержать директиву location, а также расширение файла .php.
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
fastcgi_pass php;
fastcgi_keep_conn on;
fastcgi_index index.php;
}
Добавьте в него строку
fastcgi_param SERVER_NAME $host;
и тем самым включите индекс SERVER_NAME в Вашей суперглобальной переменной $_SERVER, вот так:
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
fastcgi_pass php;
fastcgi_keep_conn on;
fastcgi_param SERVER_NAME $host;
fastcgi_index index.php;
}В результате фильтрация home_url() будет работать точно так же, как при настройке Apache, что устранит различия в поведении и проблемы, вызванные использованием Nginx.