Впервые в 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="/" />