Как исправить проблемы 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.
Ответы
Ответ 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]