it-swarm.com.ru

Как исправить WordPress HTTPS проблемы за Amazon Load Balancer?

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

Я нашел решение здесь, но требует модификации WordPress core, что плохо для обновляемости: https://wordpress.org/support/topic/when-behind-Amazon- веб-сервисы-упругая-балансировка нагрузка-причины-бесконечна переадресация

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

45
A.B. Carroll

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

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

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

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

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

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

62
A.B. Carroll

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

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

Если кто-то еще искал 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 файл).

10
Gal Talmor

Используйте этот 4-х шаговый метод, чтобы удалить цикл перенаправления и проблемы со смешанным содержимым при использовании 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, используйте эту строку, если вы находитесь за loadbalancer, чтобы перенаправить весь трафик на https.

 # http to https
 RewriteCond %{HTTP:X-Forwarded-Proto} =http
 RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
6
Ankit Anand

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

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

После этого все URL в источнике начинались с https, и все ошибки в Mixed Content исчезли.

4
Mike