Como resolver conteúdo misto de proxy reverso nginx (http, https)

5

Novo no nginx. Jogou com ele por 2 dias e não consegue descobrir como resolver isso:

Eu tenho um monte de VMs rodando em uma caixa, a caixa está atrás do meu roteador, obviamente, uma das VMs está rodando nginx (meu proxy reverso) e está configurada como DMZ.

Eu tenho o certificado SSL instalado nessa VM corretamente, agora quero que todo o tráfego de entrada seja direcionado de acordo com o caminho, por exemplo:

domain.com/service1->192.168.1.101

domain.com/service2->192.168.1.102

E assim por diante. A idéia é deixar o nginx funcionar como a camada SSL e o nginx se comunica com outras VMs via HTTP ou qualquer outro protocolo não criptografado. Então, é claro, quando o nginx falar de volta ao cliente, as mensagens serão criptografadas.

Eu tenho isso parcialmente funcionando. Se eu acessar via HTTP está tudo bem, exceto não criptografado, mas se eu acessar via HTTPS as páginas da web estão quebradas e eu recebi este tipo de erro: 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.

Eu também recebi este tipo de aviso: 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.

Agora, para alguns dos serviços, posso hackear o próprio serviço para que ele possa ser consertado ... mas eu não quero fazer isso, porque então eu tenho que hackear todos os serviços que consomem tempo e podem potencialmente quebrar alguma coisa . Eu quero tocar os serviços o mínimo possível.

Minha configuração atual funciona com o hack, mas não funciona sem hack. Abrange todo o serviço1:

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;
}

Eu procurei na internet por uma solução geral, mas encontrei apenas um hack que funcionasse para um serviço. Outros exemplos nginx / howtos não ajudaram muito (ainda recebendo os erros e avisos).

Muito obrigado antecipadamente!

    
por anetworknoobie 13.01.2015 / 05:25

4 respostas

4

Você precisa passar pelo código dos sites e substituir todas as ocorrências de http://domain.com/resource por /resource ou //domain.com/resource .

Isso garante que todos os recursos da página da Web dependentes sejam carregados com o mesmo protocolo que o site em si é carregado.

    
por 13.01.2015 / 23:01
2

Isso funcionou para o proxy nginx https > > nginx http servindo o backend do Django

Dentro de uma diretiva de localização:

proxy_set_header X-Forwarded-Proto $scheme;

Para mais detalhes, vale a pena ler este excelente artigo: link

    
por 03.03.2017 / 02:35
0

Em settings.php , defina

$base_url='';

Mas o bootstrap mostrará um erro, então altere o código abaixo em /var/www/includes/bootstrap.inc

if (isset($base_url)) { 
//change to 
if (isset($base_url) && $base_url!='') {
    
por 02.04.2015 / 10:42
0

Adicionando a este arquivo apache.conf corrigido meu problema

 <IfModule mod_setenvif.c>
  SetEnvIf X-Forwarded-Proto "^https$" HTTPS
</IfModule>
    
por 31.05.2017 / 17:58