Nginx - como ativar o ssl para o PHP quando estiver por trás de um proxy reverso

1

Eu tenho uma configuração parecida com essa (tentei simplificar isso o máximo possível):

Porta 443 - o nginx escuta e encaminha para a porta 80, config parece com isso

server {
  listen 443 ssl;
  location / {
  proxy_pass http://127.0.0.1:80;
  proxy_set_header X-Real-IP  $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto https;
  proxy_set_header X-Forwarded-Port 443;
  proxy_set_header Host $host;
}

Porta 80 - Varnish (proxy reverso) que encaminha o tráfego para a porta 8080, a menos que ocorra um cache.

configuração nginx da porta 8080 para PHP com fastcgi. Eu tenho algumas configurações comuns:

location ~ \.php$ {
  ...
  include fastcgi_params;
}

e o arquivo fastcgi_params que se parece com isso

...
fastcgi_param   HTTPS           $https if_not_empty;

O que eu tenho tentado fazer é criar uma configuração, em que o nginx ao escutar na porta 8080 é capaz de detectar se está servindo conteúdo para http ou https. Ele precisa informar isso ao PHP para que ele possa criar URLs com o esquema correto.

Eu estava pensando que em algum lugar eu deveria ouvir o X-Forwarded-Proto e depois dizer ao nginx que o https está ativado. Eu não sei como / onde fazer algum tipo de declaração if ou se algo assim é possível ou como dizer ao nginx que https deve estar ativo.

    
por googletorp 24.09.2017 / 18:11

1 resposta

3

Você pode resolver isso de duas maneiras ... no nível do aplicativo ou no nível Nginx.

No nível do aplicativo

Como é uma aplicação PHP, você pode usar o seguinte na parte superior do código / aplicativo ...

if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') $_SERVER['HTTPS']='on';

No nível Nginx

Etapa 1 : mapeie o X-Forwarded-Proto para uma variável cujo valor dependa do protocolo X-Forwarded-Proto.

map $http_x_forwarded_proto $fastcgi_param_https_variable {
    default '';
    https 'on';
}

Step 2 : Substitua a linha existente fastcgi_param HTTPS $https $if_not_empty pela seguinte linha que define o fastcgi_param HTTPS com base na variável acima

fastcgi_param HTTPS $fastcgi_param_https_variable;

Pessoalmente, prefiro o primeiro método, pois requer apenas uma linha para definir as coisas corretamente. O segundo método também deve funcionar, mas não é testado.

    
por 25.09.2017 / 04:09