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

11

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

Я настроил балансировщик нагрузки для перенаправления порта 80 на порт 80 и порта 443 на порт 80.

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

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

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

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

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

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

Любые идеи о том, как я мог бы заставить это работать с AWS ELB?

ChickenFur
источник
Вы обновили постоянную ссылку? обычно мы должны обновить постоянную ссылку на
WordPress

Ответы:

13

Я бы рискнул предположить, что вы не разместите конфигурацию ELB, что 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)

Джереми Бауз
источник
1
У этого человека была такая же проблема. forums.aws.amazon.com/…
ChickenFur
1
и этот похож на stackoverflow.com/questions/5741210/…
ChickenFur
ваше право, я переадресация с 443 до 80.
ChickenFur
Я управляю одним из моих клиентов в AWS уже более 2 лет ... Когда я читаю ваш вопрос, это первое, что пришло мне в голову как подозреваемый.
Джереми Бауз
1
Изменение LB на точку с 443 до 443 исправило это :) Спасибо!
ChickenFur
17

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

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

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

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

AB Carroll
источник
3
Это будет правильным способом сделать это, так как расшифровка SSL остается на ELB
toske
1
Если вы находитесь на nginx, подобное дополнение будет:fastcgi_param HTTPS on;
Akash Budhia
Этот пост закончил мою часовую боль ... THX
Daywalker
3

Согласно 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 больше не используется по умолчанию.

brianlmerritt
источник
1

Цитирую себя из другого полезного поста 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 в качестве прослушивателя по умолчанию.

Тим
источник
0

Как предположил @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]
Иордания
источник
0

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

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

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

    RewriteEngine On
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Джордж Улаханнан
источник