Назад | Перейти на главную страницу

Как решить проблему смешанного содержимого обратного прокси nginx (http, https)

Впервые в nginx. Играл с ним 2 дня и не могу понять, как это решить:

У меня есть несколько виртуальных машин, работающих в одном ящике, ящик, очевидно, находится за моим маршрутизатором, на одной из виртуальных машин работает nginx (мой обратный прокси) и установлен как DMZ.

У меня правильно установлен SSL-сертификат на этой виртуальной машине, теперь я хочу, чтобы весь входящий трафик направлялся в соответствии с их путем, например:

domain.com/service1->192.168.1.101

domain.com/service2->192.168.1.102

И так далее. Идея состоит в том, чтобы позволить nginx работать как уровень SSL, а nginx общается с другими виртуальными машинами через HTTP или любые другие незашифрованные протоколы. Затем, конечно, когда nginx обращается к клиенту, сообщения должны быть зашифрованы.

У меня это частично работает. Если я получаю доступ через HTTP, все в порядке, за исключением того, что он не зашифрован, но если я получаю доступ через HTTPS, веб-страницы не работают, и я получаю такую ​​ошибку: Mixed Content: The page at 'https://domain.com/service1' was loaded over HTTPS, but requested an insecure stylesheet 'http://domain.com/service1/blahblah.css'. This request has been blocked; the content must be served over HTTPS.

Еще я получил такое предупреждение: The page at 'https://domain.com/service1/' was loaded over HTTPS, but is submitting data to an insecure location at 'http://domain.com/service1/': this content should also be submitted over HTTPS.

Теперь для некоторых служб я могу взломать саму службу, чтобы ее можно было исправить ... но я не хочу этого делать, потому что тогда мне придется взламывать каждую службу, что отнимает много времени и потенциально может что-то сломать. Хочу как можно меньше касаться сервисов.

Моя текущая конфигурация работает с хаком, но не работает без хака. Он охватывает весь сервис1:

location /service1/ {
    proxy_pass              http://192.168.1.101/;

    proxy_read_timeout      3500;
    proxy_connect_timeout   3250;

    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        Host $host;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header        X-Forwarded-Proto https;

    proxy_set_header        SSL_PROTOCOL $ssl_protocol;
}

Я поискал в Интернете общее решение, но нашел только один взлом, который сработал для одной службы. Другие примеры nginx / howtos не очень помогли (все еще появляются ошибки и предупреждения).

Спасибо заранее!

Это работало для nginx https proxy >> nginx http, обслуживающего серверную часть Django

Внутри директивы местоположения:

proxy_set_header X-Forwarded-Proto $scheme;

Для получения более подробной информации стоит прочитать эту отличную статью: https://www.metaltoad.com/blog/running-drupal-secure-pages-behind-proxy

Вы должны просмотреть код сайтов и заменить все вхождения http://domain.com/resource либо с /resource или //domain.com/resource.

Это гарантирует, что все зависимые ресурсы веб-страницы загружаются по тому же протоколу, что и сам веб-сайт.

Добавление в этот файл apache.conf устранило мою проблему

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

В settings.php, устанавливать

$base_url='';

Но bootstrap покажет вам ошибку, поэтому измените приведенный ниже код в /var/www/includes/bootstrap.inc

if (isset($base_url)) { 
//change to 
if (isset($base_url) && $base_url!='') {

Возможно, я опоздаю на полдесятилетия, но недавно я столкнулся с проблемой, и для меня решение было установлено на странице HTML:

<base href="/" />