Как исправить проблемы с HTTPS в WordPress при использовании балансировщика нагрузки Amazon?

У меня была эта проблема раньше. При запуске WordPress (или других сценариев PHP) за балансировщиком нагрузки EC2 Amazon, сценарии не осознают, что они выполняются по протоколу https: //, что приводит к таким проблемам, как бесконечные циклы перенаправления и предупреждения HTTPS ("Некоторое содержание на этом страница запрашивается небезопасным способом ... ").

Я нашел здесь решение, но требует изменения ядра WordPress, что не способствует обновлению: https://wordpress.org/support/topic/when-behind-amazon-web-services-elastic-load-балансировщик-вызывает-бесконечноеперенаправление

Есть ли способ исправить это, не изменяя ядро ​​WordPress? Я использую Apache 2.2.


person A.B. Carroll    schedule 08.06.2015    source источник


Ответы (5)


Как и в предложенной вами ссылке, проблема для WordPress заключается в функции is_ssl(), которая, как и большинство программ PHP, явно проверяет $_SERVER['HTTPS'] и $_SERVER['SERVER_PORT'], чтобы проверить, осуществляется ли доступ к текущей странице в контексте https: //.

Когда доступ к вашей странице осуществляется через HTTPS, но Amazon Load Balancer выполняет разгрузку SSL и фактически запрашивает ваш контент через порт 80 без SSL, веб-сервер, PHP или что-либо еще в этом отношении не понимает или не видит, что это происходит. доступ через https: //.

Исправление заключается в том, что Amazon ELB отправляет де-факто стандартный X-Forwarded-Proto HTTP-заголовок, который мы можем использовать, чтобы выяснить, какой протокол фактически использует клиент на другой стороне балансировщика нагрузки.

С Apache 2.2 вы можете использовать что-то вроде:

<IfModule mod_setenvif.c>
  SetEnvIf X-Forwarded-Proto "^https$" HTTPS
</IfModule>

Это просто читает заголовок X-Forwarded-Proto. Если это значение равно https, тогда для переменной среды HTTPS устанавливается значение 1. PHP увидит эту переменную среды и в конечном итоге станет $_SERVER['HTTPS'], что равно 1 - точно так же, как это было бы для настоящего собственного запроса SSL.

person A.B. Carroll    schedule 08.06.2015
comment
Работает нормально, вам нужно убедиться, что вы включили модуль apache2 setenvif. - person MichaelICE; 15.05.2017
comment
просто добавил в конфигурацию apache (образ с битнами) и все работает. - person sebge2; 19.01.2018
comment
Обратите внимание, что во многих ситуациях с прокси-сервером X-Forwarded-Scheme используется как синоним. Как правило, безопасно устанавливать и то, и другое. - person djsadinoff; 15.02.2018
comment
Также работает на Apache2.4 - person Jeremy; 09.10.2018
comment
Этот ответ подходит мне лучше всего, потому что он работает не только в Wordpress, но и в Laravel. - person Tan Jia Ming; 06.03.2020

Другой вариант из документации WordPress - добавьте это в свой wp-config.php:

if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
       $_SERVER['HTTPS']='on';
person zeroimpl    schedule 29.01.2017
comment
Это тот метод, который я использовал. Есть идеи, как заставить людей использовать HTTPS, если они обращаются к странице через HTTP? - person Matt Winer; 03.02.2017
comment
Вы также можете попробовать добавить force_ssl_content(true); в wp-config.php. Обычно я делал это с помощью правила перезаписи Apache или в конфигурации балансировщика нагрузки. - person zeroimpl; 03.02.2017
comment
@MattWiner, если вы используете AWS ELB, вам необходимо настроить отдельный прослушиватель на порт 80, направить его на ваш сервер EC2 на другой порт (например, 81) и выполнить переопределение URL-адреса для перенаправления любых запросов на версию HTTPS. исходного URL. Тогда веб-браузер вместо этого запросит URL-адрес HTTPS. - person Action Dan; 13.05.2018
comment
Простое и понятное решение +1. Работал на моем сайте WordPress, обслуживающем HTTP, за балансировщиком нагрузки AWS с включенным SSL. - person ejazazeem; 09.01.2019
comment
теперь вы можете настроить перенаправление с http на https на балансировщике нагрузки приложения напрямую - person wkhatch; 05.03.2019

Если кто-то еще искал аналог этого Nginx, вот что вам нужно сделать:

Для настройки перезаписи вы должны добавить в блок server следующее:

if ($http_x_forwarded_proto != 'https') {
    rewrite ^ https://$host$request_uri? permanent;
}

А для установки параметра HTTPS вы должны добавить в блок location ~ \.php$ следующее:

if ($http_x_forwarded_proto = 'https') {
    set $fe_https 'on';
}
fastcgi_param HTTPS $fe_https;

Не забудьте удалить любую другую команду fastcgi_param HTTPS, если она у вас есть (у меня она была в моем fastcgi_params файле).

person Gal Talmor    schedule 27.10.2017
comment
Вы спасли мою задницу на производстве! Ваше здоровье! - person Paté; 16.12.2017
comment
Рад помочь. Ваше здоровье :) - person Gal Talmor; 17.12.2017

Используйте этот четырехэтапный метод, чтобы удалить цикл перенаправления и проблемы со смешанным контентом при использовании ssl в WordPress.

1) Замените 'http: //' на '//' в базе данных - это создаст все относительные URL-адреса для изображений и других ресурсов.

2) в wp-config определите общие переменные wp_home и wp_siteurl.

define('WP_HOME','//'. $_SERVER['SERVER_NAME']);
define('WP_SITEURL','//'. $_SERVER['SERVER_NAME']);

3) Если вы используете балансировщик нагрузки, используйте серверную переменную HTTP_X_FORWARDED_PROTO, чтобы определить используемый протокол. Для этого добавьте эту строку в wp-config

if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
$_SERVER['HTTPS']='on';

4) Наконец, в .htaccess используйте эту строку, если вы находитесь за балансировщиком нагрузки, чтобы перенаправить весь трафик на https.

 # http to https
 RewriteCond %{HTTP:X-Forwarded-Proto} =http
 RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
person Ankit Anand    schedule 07.10.2017
comment
На шаге 1, где в базе данных? - person emmdee; 21.08.2018
comment
На это решение можно было бы указать ELB от порта 443 до 80 - person Amirul; 27.06.2019

К сожалению, ни один из вышеперечисленных способов не помог мне решить ошибки смешанного содержимого. Однако что действительно работало, так это добавление протокола к переменным WP_HOME && WP_SITEURL в wp-config.php, например.

define( 'WP_HOME', 'https://' . $_SERVER['HTTP_HOST']); define( 'WP_SITEURL', WP_HOME );

После этого все URL-адреса в источнике начинались с https, и все ошибки смешанного содержимого исчезли.

person Mike    schedule 10.07.2017