Archive for nginx

Manipulando X-Forwarded-Proto no backend Nginx

Quando o Nginx começou a ser usado como servidor backend, ele sempre conversou em texto puro “HTTP” com o servidor de frontend (por razões de performance e por uma configuração mais simples)

Mas aplicações web frequentemente precisão saber, se o trafego entre o browser e o servidor de backend esta encriptado (HTTPS). ex: quando é checado se uma parte particular do site esta sendo acessada de maneira segura.

Uma vez que somente o proxy frontend (aquele entre nginx e o browser) sabe disso, essa informação deve ser enviado para o servidor de backend.

Uma solução comum é que o frontend marque o “X-Forwarded-Proto” header quando fizer o forward da requisição do browser para o servidor de backend.

Isto é muito parecido com a informaçao sobre o IP do browser: isto só é conhecido pelo proxy frontend e o backend somente verá o IP do proxy frontend, mas não o IP de quem realmente requisitou tal chamada.

O “X-Real_IP” header é frequentemente usado para fazer forward desta informação do frontend para o backend e o Nginx suporta isto atraves do NginxHttpRealIpModule, ex: set_real_ip_from $ip_frontend;

Infelizmente não há suporte ainda para o X-Forwarded-Proto, mas pode ser aplicado facilmente com o código abaixo:

server {
[...]
set $my_https "off";
if ($http_x_forwarded_proto = "https") {
set $my_https "on";
}
location ~ ^(.+\.php)(.*)$ {
[...]
fastcgi_param HTTPS $my_https;
}
}

Isto ira adicionar a variavel HTTPS de “On” para “Off”, de acordo com o resultado do X-Forwarded-Proto (http ou https)

Se o Nginx tambem for usado como um proxy frontend, você pode passar a informação conforme abaixo no contexto location:

proxy_set_header X-Real-IP $remote_addr;

Este texto foi extraido e traduzido de: http://daniel.hahler.de/handle-x-forwarded-proto-in-backend-nginx#more3053