Циклическое перенаправление WordPress wp-admin через https
Я использую nginx в качестве веб-сервера и отредактировал файл конфигурации для работы с https. Я изменил настройки URL WordPress на https и также добавил код WordPress force ssl admin в файл wp-config, но продолжаю получать ошибку "На этой странице обнаружено циклическое перенаправление"

Вы добавили $_SERVER['HTTPS'] = 'on'; в ваш wp-config.php?
Также вам следует использовать плагин WP Migrate DB для миграции с http://вашсайт.com на https://вашсайт.com
Спасибо! Вероятно, ты сэкономил мне несколько часов попыток понять, почему админка не работает с SSL.
Sledge Hammer
это здорово, единственная проблема - как установить плагин, если сайт не работает :) Я знаю, что всегда нужно делать резервную копию перед такими действиями, но все же. Приведенное ниже решение сработало для меня :)
Timur Gafforov
Почему это работает? Я уже использовал инструмент S&R от Interconnect. В базе данных уже должен быть правильный протокол.
Jeff
условие if в документации не сработало для меня, поэтому я просто всегда устанавливаю $_SERVER['HTTPS'] = 'on';
lewis
После добавления $_SERVER['HTTPS']='on'; в wp-config.php я получаю сообщение Извините, у вас нет доступа к этой странице. на странице /wp-admin, хотя я вошёл как администратор. Я использую Cloudflare flexible SSL, поэтому HTTPS-трафик перенаправляется на HTTP-порт.
baptx
Нам нужно добавить if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) { $_SERVER['HTTPS'] = 'on'; } перед require_once(ABSPATH . 'wp-settings.php');, как сказано здесь: https://wordpress.stackexchange.com/questions/250240/setting-serverhttps-on-prevents-access-to-wp-admin#comment414886_250254 https://wordpress.stackexchange.com/questions/262194/cannot-login-to-wordpress-admin-with-ssl-terminated-load-balancer/263461#263461
baptx
Извините, что добавляю ещё один комментарий про $_SERVER['HTTPS'] = 'on';, но это действительно исправило все проблемы с редиректами и у меня. Я перепробовал все возможные изменения в nginx.conf, а также remove_filter('template_redirect', 'redirect_canonical'); что сработало, но только для главной страницы. $_SERVER['HTTPS'] = 'on' сразу же исправил всё. Спасибо!!!!
Daniel
Спасибо за это. Это сработало после 2 часов попыток других исправлений.
hypern00b
+10000, бился головой об стену, пытаясь понять, почему SSL сломал URLs в админке и на страницах
Wobbles
Огромное спасибо! Часы поисков наконец привели меня в нужное место.
Foxan Ng
СПАСИБО!! Это очень важно для Cloudflare и должно быть частью руководства.
Sprachprofi
Вы гений! Огромное спасибо. Я потратил столько часов, чтобы разобраться в этом. Вы вытащили меня из бесконечного цикла. Спасибо!!
SequenceDigitale.com
У меня была похожая проблема, и я просто добавил следующий фрагмент в свой wp-config.php:
/** SSL */
define('FORCE_SSL_ADMIN', true);
// в некоторых настройках HTTP_X_FORWARDED_PROTO может содержать
// список, разделенный запятыми, например http,https
// поэтому проверяем наличие https
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
$_SERVER['HTTPS']='on';
как предложено в Кодексе. Это понадобится только в случае, если у вас включен SSL passthrough в настройках балансировщика нагрузки (или файрвола). Это означает, что хотя вы можете получить доступ к сайту через HTTP внутри TLS/SSL, сервер получает только HTTP-трафик. Чтобы это учесть, нужен приведенный выше заголовок, чтобы WordPress мог "установить" HTTPS в значение on в массиве конфигурации $_SERVER.
Это отличное решение, особенно для тех, кто использует балансировщик нагрузки. Я размещал это с помощью Dokku (самостоятельно развертываемого клона Heroku) и столкнулся с проблемами загрузки статических ресурсов и бесконечным редиректом в wp-admin. Dokku также использует обратный прокси nginx для перенаправления входящего трафика с порта 443 на порт 80, и это решение исправляет проблему.
Zach McCormick
Мне пришлось просто добавить $_SERVER['HTTPS'] = 'on';, потому что HTTP_X_FORWARDED_PROTO даже нет в настройках на сервере моего клиента :|
Tom Roggero
Идеально решило мою проблему при использовании балансировщика нагрузки AWS.
Josh
Это также решило проблему "Слишком много перенаправлений", так как мой сайт находится за балансировщиком нагрузки на AWS.
voam
Думаю, важно добавить к этому ответу исправление для файла .htaccess в таких случаях: https://stackoverflow.com/questions/36748110/htaccess-too-many-redirects-when-trying-to-force-https, проверьте ответ @harshal-lonare.
Gustavo Jantsch
Поскольку у меня пока нет права оставлять комментарии, я опубликую это дополнение в виде отдельного ответа:
Решение, предложенное Elias, с добавлением следующего кода в wp-config.php, сработало для меня:
/** SSL */
define('FORCE_SSL_ADMIN', true);
// в некоторых настройках HTTP_X_FORWARDED_PROTO может содержать
// список, разделённый запятыми, например http,https
// поэтому проверяем наличие https
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
$_SERVER['HTTPS']='on';
Однако это сработало только тогда, когда я разместил этот код перед всем остальным в этом файле!
Именно в этом была моя проблема. Я добавил эти строки в конец файла, и это не работало. Я уже был готов пересоздать сайт с нуля. Переместил их в начало, и бац — проблема решена. Спасибо вам, огромное спасибо!!
Dean Poulin
Это отличное решение, если вы используете гибкий SSL за прокси-DNS, например Cloudflare. Спасибо.
Stefan P
Подтверждаю, что работает. Огромное спасибо, это решает множество проблем с API и IFrame. На сайте не включен HTTPS, но для некоторых страниц он нужен. WordPress должен иметь такую настройку по умолчанию...
Andy
К вашему сведению - этот код может находиться где угодно, но должен быть перед require_once( ABSPATH . 'wp-settings.php' );, который находится в конце файла.
Damodar Bashyal
Еще один вариант для заметок, просто добавьте это в начало файла wp-config.php
Причина в том, что могут быть балансировщики нагрузки или что-то еще, что не передает правильное значение https, поэтому вам нужно получить его из другого источника и имитировать для WordPress.
if ( (isset($_SERVER['HTTP_X_FORWARDED_PORT'] ) && ( '443' == $_SERVER['HTTP_X_FORWARDED_PORT'] ))
|| (isset($_SERVER['HTTP_CF_VISITOR']) && $_SERVER['HTTP_CF_VISITOR'] == '{"scheme":"https"}')) {
$_SERVER['HTTPS'] = 'on';
}
Только что применил это решение для WordPress 5.5.1, работающего за HAProxy на фаерволе pfsense. Другие предложенные варианты не работали корректно, по крайней мере "из коробки" без дополнительной настройки HAProxy и заголовков, которые он отправляет.
Swift
5-летний вопрос...
Итак, у меня возникла эта ошибка после установки SSL-сертификата и изменения всех ссылок с http на https с использованием wp-cli.phar, который можно найти здесь.
Я пробовал различные конфигурации, но ни одна из них не решала проблему, пока я не установил следующее:
define('FORCE_SSL_ADMIN', true);
define('FORCE_SSL_LOGIN', true);
на это:
define('FORCE_SSL_ADMIN', false);
define('FORCE_SSL_LOGIN', false);
Это позволило мне зайти на страницу входа, но фактически войти в систему не удавалось. Я попробовал второй вариант ответа, но, к сожалению, это тоже не помогло, пока я не внес следующее изменение:
/** SSL */
define('FORCE_SSL_ADMIN', true);
// в некоторых настройках HTTP_X_FORWARDED_PROTO может содержать
// список через запятую, например http,https
// поэтому проверяем наличие https
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== true)
$_SERVER['HTTPS']='on';
По какой-то причине, которую я не понимаю, мне пришлось изменить
!== false
на
!== true
Я использую nginx в качестве хоста и обратного прокси для nginx unit... Если у кого-то есть идеи, почему это сработало, пожалуйста, дайте мне знать.
На самом деле... У меня была эта проблема, а решение оказалось довольно простым и даже неловким. По какой-то причине на хостинге папка wp-admin была удалена, из-за чего и возникала эта ошибка.
После многих часов тестирования различных способов я просто заметил это, и после загрузки папки обратно всё заработало как обычно.
Проверьте это, ребята, иногда всё может быть настолько просто.
У меня была такая же проблема, когда я разместил свой сайт на Azure WebApp Service под Linux.
Попробуйте этот плагин. Будьте осторожны, когда он активен, он работает. https://wordpress.org/plugins/jsm-force-ssl/
Этот плагин использует нативные фильтры WordPress вместо буфера вывода PHP для максимальной надежности, производительности и совместимости с кешированием (этот плагин не влияет на производительность кеширования), а также 301 постоянные редиректы для лучшего SEO (редиректы 301 считаются лучшими для SEO при переходе с HTTP на HTTPS).
Учитывает переменные прокси / балансировки нагрузки для крупных хостинг-сред:
HTTP_X_FORWARDED_PROTO HTTP_X_FORWARDED_SSL Требования:
Ваш веб-сервер должен быть настроен с SSL-сертификатом и способен обрабатывать HTTPS-запросы.
Просто активируйте плагин, и всё готово:
Нет настроек плагина для изменения, и никакие изменения не вносятся в конфигурацию WordPress — просто активируйте или деактивируйте плагин, чтобы включить / отключить фильтры и динамические редиректы.
Я столкнулся с той же проблемой, и после нескольких часов исследований и доработок мне удалось заставить всё работать. Я поделюсь всем, что сделал, потому что не уверен, связаны ли все эти действия.
Во-первых, мой сайт на WordPress размещен на cPanel, поэтому я использовал инструмент Softaculous в cPanel для обновления версии WordPress.
Во-вторых, я обновил базу данных WordPress.
(Я заметил, что мой файл .htaccess в корневой папке сайта был обновлен с добавлением строки RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}])
Затем я проверил файл .htaccess в папке wp-admin и увидел там следующие команды:
Order Allow,Deny
Deny from all
На сайте WordPress я прочитал, что эти команды предназначены для предотвращения веб-доступа к файлам в этой папке, но такое поведение мне не требовалось (на мой взгляд).
Поэтому я закомментировал эти строки и смог загрузить админ-панель.
Спасибо, это сработало для меня. Вы сделали мой день
/** SSL */
define('FORCE_SSL_ADMIN', true);
// в некоторых настройках HTTP_X_FORWARDED_PROTO может содержать
// список, разделенный запятыми, например http,https
// поэтому проверяем наличие https
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
$_SERVER['HTTPS']='on';
Это просто ответ Элиаса?
Rup