Внесите HTTP-HTTPS через балансировщик нагрузки AWS EC2

92
10

У нас есть балансировщик нагрузки AWS EC2, и на нем установлен SSL-сертификат. Но серверы в пуле по-прежнему работают на порту 80 и не-SSL-протоколе.


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


RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Я пробовал то же самое в PHP-коде, что тоже не работало.


if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != "on") {
$url = "https://" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
redirect($url);
exit;
}

Итак, я понимаю, что серверы по-прежнему работают по протоколу HTTP, и сертификат применяется только к балансировщику нагрузки. Что было бы лучшим решением для такой переадресации в этом сценарии. Одно из решений, о которых я мог подумать, - это проанализировать URL-адрес в коде, чтобы увидеть, есть ли там http:// и перенаправить. Это может сработать, но я действительно не считаю это чистым и окончательным решением. Есть ли способ, которым AWS EC2 может перенаправлять таким образом? Я не знаком с AWS EC2.


Также есть ли какие-либо параметры сервера, которые могут предполагать, что сервер работает на порту 80, но HTTPS все еще on?

спросил(а) 2021-01-19T16:29:30+03:00 9 месяцев назад
1
Решение
91

Мне удалось найти решение в документах AWS здесь.


В нем говорится, что load-balancer AWS пересылает следующие серверные вары в пул.


X-Forwarded-Proto specifies the protocol ("http" or "https") of the original request made to the Elastic Load Balancer.
X-Forwarded-Port specifies the port of the original request.

Итак, поскольку мы используем AWS EC2, он решает проблему, но будьте осторожны, если вы используете какую-либо другую среду, поскольку они могут отсутствовать там.


Полный код:


if(isset($_SERVER['HTTP_X_FORWARDED_PROTO'])){

if ($_SERVER['HTTP_X_FORWARDED_PROTO']=="http") {
$url = "https://" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
redirect($url);
exit;
}

}

ответил(а) 2021-01-19T16:29:30+03:00 9 месяцев назад
79

Используйте следующее правило:


RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]

ответил(а) 2021-01-19T16:29:30+03:00 9 месяцев назад
46

https://stackoverflow.com/questions/5106313/redirecting-from-http-to-https-with-php


Итак, из приведенной выше ссылки я использовал этот PHP-код в файле header.php, который вызывает все остальные файлы:


<?php
if (!(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' ||
$_SERVER['HTTPS'] == 1) ||
isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
$_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'))
{
$redirect = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
header('HTTP/1.1 301 Moved Permanently');
header('Location: ' . $redirect);
exit();
}
?>

Это изменило все запросы на HTTPS и, похоже, охватывает все базы

ответил(а) 2021-01-19T16:29:30+03:00 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема