Подтвердить что ты не робот

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

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

Я нашел решение здесь, но требует изменения ядра WordPress, что не очень хорошо для обновляемости: https://wordpress.org/support/topic/when-behind-amazon-web-services-elastic-load-balancer-causes-endless -redirect

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

4b9b3361

Ответ 1

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

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

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

С 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.

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

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]