Как исправить ERR_TOO_MANY_REDIRECTS в WordPress

При использовании 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;
Оцените документ
Обновлено 11.04.2025

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *