При использовании WordPress на хостинге с проксированием через nginx → apache
или nginx → php-fpm
, нередко можно столкнуться с ошибкой:
ERR_TOO_MANY_REDIRECTS
Эта ошибка может появляться даже при корректных URL в настройках сайта (siteurl
и home
) и правильной SSL-конфигурации. Причина — WordPress получает некорректные заголовки от прокси-сервера, в частности:
$_SERVER['HTTP_HOST']
содержит порт (например,example.com:443
);$_SERVER['HTTPS']
отсутствует, даже если клиент использует HTTPS;$_SERVER['SERVER_PORT']
задан некорректно (например, 80 при HTTPS).
В этой статье рассмотрим, как можно обойти проблему, даже если вы не можете редактировать конфигурацию nginx.
🚧 Причина ошибки: некорректные заголовки от прокси #
Типичная ошибка возникает, когда WordPress сравнивает текущий URL с установленным в siteurl
, и видит расхождение:
https://example.com
(задано в настройках WordPress)https://example.com:443
(пришло из$_SERVER['HTTP_HOST']
)
WordPress воспринимает это как внешний URL → делает редирект → браузер снова получает example.com:443
→ и так по кругу.
✅ Решение: фильтрация $_SERVER['HTTP_HOST']
#
Чтобы убрать лишний порт, можно вставить следующий код в wp-config.php
, до строки require_once(ABSPATH . 'wp-settings.php');
:
if (strpos($_SERVER['HTTP_HOST'], ':') !== false) {
$_SERVER['HTTP_HOST'] = explode(':', $_SERVER['HTTP_HOST'])[0];
}
📌 Этот код проверяет, содержит ли заголовок HTTP_HOST
порт, и если да — удаляет его. Таким образом, WordPress видит домен в корректном виде: example.com
.
🛡️ Дополнительно: Указание протокола HTTPS вручную #
Если сервер не передаёт заголовок X-Forwarded-Proto: https
или HTTPS=on
, можно задать его вручную:
$_SERVER['HTTPS'] = 'on';
Это особенно важно, если WordPress пытается переключиться обратно на http://
.
🛠️ Альтернативное решение — фиксированные адреса #
Если вы точно знаете, что сайт будет работать всегда по https://
, и по одному домену — можно задать жёстко в wp-config.php
:
define('WP_HOME', 'https://example.com');
define('WP_SITEURL', 'https://example.com');
Это полностью отключит логику автодетекта URL.
🔄 Вариант с фильтрами (если не хотите менять wp-config.php
) #
Если у вас доступ есть только к теме или плагинам, добавьте в functions.php
:
add_filter('site_url', function($url) {
return preg_replace('#^http://#', 'https://', $url);
});
add_filter('home_url', function($url) {
return preg_replace('#^http://#', 'https://', $url);
});
💡 Заключение #
Проблема с ERR_TOO_MANY_REDIRECTS
чаще всего связана не с ошибками WordPress, а с некорректной передачей заголовков на уровне прокси. Простое исправление $_SERVER['HTTP_HOST']
и установка $_SERVER['HTTPS'] = 'on'
позволяют обойти ситуацию, даже если вы не имеете доступа к nginx-конфигурации.
Если вы администрируете сервер самостоятельно — всегда проверяйте, как настроены заголовки:
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header HTTPS on;
Добавить комментарий