Назад | Перейти на главную страницу

Бесконечный цикл перенаправления с AWS ELB и сайтом wordpress с использованием плагина https для wordpress

Я настроил AWS ELB так, чтобы он указывал на мой сервер Ubuntu, на котором запущен Wordpress 3.2.1. На сервере все отлично работало, пока я не поставил его за балансировщик нагрузки.

Я настраиваю балансировщик нагрузки, чтобы перенаправить порт 80 на порт 80 и порт 443 на порт 80.

Я настраиваю файл виртуальных хостов, чтобы проверить заголовки из elb:

RewriteEngine On
RewriteCond% {HTTP: X-Forwarded-Proto}! Https
RewriteRule! / Статус https: //%{SERVER_NAME}% {REQUEST_URI} [L, R]

Теперь всякий раз, когда я перехожу на https-адрес, я получаю следующее сообщение:

На этой веб-странице есть цикл перенаправления
Веб-страница по адресу https://mywebsite.com/securepage/ привело к слишком большому количеству перенаправлений

Как только я отключу плагин https для wordpress
(http://wordpress.org/extend/plugins/wordpress-https/)
Страницы работают, но теперь они заполнены смешанным содержанием. страницы, которые должны быть https, больше не https.

Как только я обращаюсь к серверу напрямую, а не через эльб, он снова работает.

Есть идеи, как заставить это работать с AWS ELB?

Попробуйте добавить это в свой httpd.conf или .htaccess

SetEnvIfNoCase X-FORWARDED-PROTO "^https$" HTTPS

При использовании балансировщика нагрузки + HTTPS ваш веб-сервер не знает, что HTTPS используется во внешнем интерфейсе, поэтому продолжает попытки перенаправления на сайт HTTPS, хотя на самом деле HTTPS уже используется.

Вышеупомянутое переведет заголовок, который отправляет балансировщик нагрузки Amazon (X-Forwarded-Proto: https) в переменную среды, которую понимают Wordpress и другие сценарии PHP (HTTPS=1)

Я бы рискнул предположить, что без вашей публикации конфигурации ELB он перенаправляет трафик HTTPS (443 / tcp) на экземпляр EC2 по HTTP (80 / tcp). Тогда ты .htaccess и плагин пытаются перенаправить его обратно на HTTPS, потому что он просматривается через HTTP.

Взгляните на свою консоль EC2 под Network & Security > Load Balancers и я полагаю, вы увидите Port Configuration говорит что-то вроде 443 forwarding to 80 (HTTPS, Certificate: blah)

Согласно Amazon здесь https://d0.awsstatic.com/whitepapers/deploying-wordpress-with-aws-elastic-beanstalk.pdf исправление:

/** Detect if SSL is used. This is required since we are terminating SSL either on CloudFront or on ELB */ 
if (($_SERVER['HTTP_CLOUDFRONT_FORWARDED_PROTO'] == 'https') OR ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'))
    {$_SERVER['HTTPS']='on';}

У меня все еще оставался бесконечный цикл, поэтому я изменил свою конфигурацию WordPress, начиная с:

define('WP_HOME','http://www.example.com');
define('WP_SITEURL','http://www.example.com');

кому:

define('WP_HOME','https://www.example.com');
define('WP_SITEURL','https://www.example.com');

Это заставит пользователей перейти на https, даже если они наберут http, а также упростит разработку сайта в автономном режиме, потому что вы просто обновляете WP_HOME до локального хоста, и https больше не является значением по умолчанию.

Цитируя себя из другого полезного сообщения https://serverfault.com/a/858308/450836:

Для меня было достаточно установить $ _SERVER ['HTTPS'] = 'on'; в wp-config.php. Я использую AWS ELB, который прерывает SSL на ELB. Поэтому nginx принимает запрос на порт 80 (8080 после лака), и похоже, что wordpress не смог справиться с ним, пока вы явно не сообщите PHP, что сайт уже использует https ...

Для прослушивателя ELB без SSL я использую отдельную конфигурацию для перенаправления всего трафика на https в качестве прослушивателя по умолчанию.

Как предположил @Tim, это $_SERVER['HTTPS']='on'; в wp-config.php помогло мне.

Я также добавил это в свой файл .htaccess, чтобы принудительно использовать HTTPS:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=302]

Исправлено слишком много проблем с перенаправлением в aws ALB

Включите модуль заголовка, затем добавьте следующую запись в конфигурацию apache

SetEnvIf X-Forwarded-Proto "https" HTTPS = on RequestHeader установите HTTPS "на" env = HTTPS

    RewriteEngine On
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

AWS WP слишком много перенаправлений (err_too_many_redirects wordpress на AWS)

ФАКТИЧЕСКОЕ РЕШЕНИЕ, если у вас есть балансировщик нагрузки AWS 443, перенаправляющий на порт 80 сервера:

A. добавьте следующее, начиная с самой первой строки 1 файла .htaccess:

SetEnvIfNoCase X-FORWARDED-PROTO "^https$" HTTPS

RewriteEngine On

RewriteCond %{HTTP:X-Forwarded-Proto} !https

RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]

Б. добавьте следующее в wp-config.php над строкой «require_once (ABSPATH. 'Wp-settings.php');»

**define('FORCE_SSL_ADMIN', true);

define('RELOCATE', TRUE);

if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')

    $_SERVER['HTTPS'] = 'on';**