При использовании 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;
Добавить комментарий