Вопрос или проблема
У меня есть домашняя страница, застрявшая в петле 301 редиректа.
У меня два сервера. ServerA и ServerB. serverA: domain-a.com использует nginx как обратный прокси. ServerB: domain-b.com использует nginx.
domain-a.com проксирует domain-b.com
Симптомы
Сайт настроен на отображение статической страницы. Если я изменю его на отображение самых последних постов, они отображаются правильно.
Не имеет значения, какую статическую страницу я установил в качестве домашней, ни одна из них не отображается правильно как домашняя страница.
Статические страницы отображаются нормально, когда я просматриваю их напрямую (например, https://domain-a.com/home-page/)
Не имеет значения, какая тема активна, главная страница ведет себя одинаково.
Что я пробовал
Регенерация постоянных ссылок
Отключение всех плагинов
Я использую domain-a.com для доступа к сайту WordPress. Если я изменю WP на отображение последних постов, они отображаются правильно.
Если я изменяю постоянные ссылки на “Простые”, https://www.domain-a.com/?p=123, тогда главная страница работает хорошо, но мне нужен URL типа “имя поста”.
Конфигурация обратного прокси nginx:
# ServerA Nginx
#PROXY-START/
location ^~ /
{
proxy_pass https://domain-b.com;
proxy_set_header Host domain-b.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_http_version 1.1;
# proxy_hide_header Upgrade;
port_in_redirect off;
add_header X-Cache $upstream_cache_status;
#Установка кэша Nginx
if ( $uri ~* "\.(gif|png|jpg|css|js|woff|woff2)$" )
{
expires 1m;
}
proxy_ignore_headers Set-Cookie Cache-Control expires;
proxy_cache cache_one;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 304 301 302 1m;
}
location @handle_redirects {
set $saved_redirect_location '$upstream_http_location';
proxy_pass $saved_redirect_location;
}
#PROXY-END/
//ServerB, wp-config.php
define('WP_HOME','https://domain-a.com');
define('WP_SITEURL','https://domain-a.com');
Ответ или решение
Проблема зацикливания редиректов WordPress за обратным прокси Nginx
Описание проблемы
Вы столкнулись с проблемой зацикливания редиректов на главной странице вашего сайта, который работает на WordPress и размещен за обратным прокси-сервером Nginx. Конфигурация состоит из двух серверов: ServerA (обратный прокси на domain-a.com
) и ServerB (основной сервер на domain-b.com
). Проблема заключается в том, что домашняя страница не отображается корректно, но другие статические страницы работают без проблем, если к ним обращаться непосредственно по URL.
Причины зацикливания редиректов
1. Неверные настройки URL-адресов WordPress.
В вашей конфигурации указаны:
define('WP_HOME','https://domain-a.com');
define('WP_SITEURL','https://domain-a.com');
Эти параметры могут вызвать проблемы с редиректами, так как WordPress считает, что он должен находиться на domain-a.com
, однако на самом деле он обрабатывает запросы на domain-b.com
.
2. Конфигурация Nginx.
Проблема может быть вызвана неправильной обработкой заголовков, особенно X-Forwarded-Host
и X-Forwarded-Proto
. Без правильной обработки этих заголовков Nginx может неправильно интерпретировать итоговый URL, вызывая зацикливание.
Рекомендации по решению проблемы
1. Изменение настроек WordPress:
Попробуйте изменить параметры WP_HOME
и WP_SITEURL
в wp-config.php
на:
define('WP_HOME','https://domain-b.com');
define('WP_SITEURL','https://domain-b.com');
Это позволит WordPress правильно обрабатывать редиректы и URL.
2. Обновление конфигурации Nginx:
Попробуйте изменить заголовки, которые передаются прокси-сервером. Ваша конфигурация выглядит правильно, но вам стоит добавить proxy_set_header X-Forwarded-Proto $scheme;
, если это еще не сделано. Это должно помочь WordPress понять, что запрос поступает через HTTPS.
3. Проверка на наличие правил редиректа:
Убедитесь, что в вашем .htaccess файле (или в конфигурации Nginx) нет дополнительных правил редиректа, которые могут вызывать конфликты. Если у вас есть правила редиректа, временно отключите их и проверьте поведение.
4. Журналирование и мелкие настройки:
Добавьте следующие строки в вашу конфигурацию Nginx для улучшения диагностики:
error_log /var/log/nginx/error.log debug;
Это позволит вам увидеть более детальные сообщения об ошибках и, возможно, укажет на причину проблемы.
Резюме
Проблема с зацикливанием редиректов может быть вызвана неправильной конфигурацией URL-адресов в WordPress и конфигурации Nginx. Рекомендуется изменить параметры WP_HOME
и WP_SITEURL
, обновить конфигурацию Nginx, а также проверить правила редиректа. Если проблема сохраняется, рассмотрите возможность проведения дополнительной отладки, используя журналы ошибок.
Если у вас будут вопросы или потребуется дальнейшая помощь, не стесняйтесь обращаться за поддержкой.