Soy bastante nuevo en Nginx, y parece todo muy confuso. Tengo mi servidor configurado perfectamente, pero el problema es que mi servidor está protegido mediante un proxy HTTP; en lugar de registrar las IP de los usuarios reales, está registrando la IP del servidor proxy.
Lo que intenté hacer fue configurar $_SERVER['REMOTE_ADDR'];
a $_SERVER['X-Forwarded-For'];
pero recibo un error de índice indefinido, así que supongo que tengo que definir X-Forwarded-For
en Nginx? Pero no sé cómo hacerlo, tengo una configuración simple, es solo Nginx con PHP. Nada más y nada menos.
He buscado en toda la web, pero en realidad no puedo encontrar información que sea fácil de entender.
Tengo acceso al código fuente, si eso ayuda un poco. He intentado muchas soluciones, pero fue en vano.
La forma correcta de hacerlo es configurando el real_ip_header
configuración en nginx.
Ejemplo con IP de proxy HTTP de confianza:
set_real_ip_from 127.0.0.1/32;
real_ip_header X-Forwarded-For;
De esta forma, el $_SERVER[‘REMOTE_ADDR’] se llenará correctamente en PHP fastcgi.
-
He estado buscando EN TODAS PARTES una solución que realmente funcione. ¡¡¡¡Muchas gracias!!!! ¡IMPRESIONANTE! Simplemente colóquelo en su… servidor { ubicación ~ \.php$ { sección de bloque. y todo funciona!!!! ¡GRAN TRABAJO!
– CGris
08/07/2015 a las 15:50
-
usar
0.0.0.0/0
y::/0
para hacer coincidir todas las direcciones IP– pravdomil
3 de julio de 2018 a las 15:58
fredrick
$http_x_forwared_for
puede contener varias direcciones IP, donde la primera debe ser la IP del cliente. REMOTE_ADDR
solo debe ser la ip del cliente.
Entonces, al usar expresiones regulares en su nginx.conf
puede establecer REMOTE_ADDR
a la primera ip de $http_x_forwarded_for
al igual que:
set $realip $remote_addr;
if ($http_x_forwarded_for ~ "^(\d+\.\d+\.\d+\.\d+)") {
set $realip $1;
}
fastcgi_param REMOTE_ADDR $realip;
-
Como no es posible utilizar
set
directiva enhttp
bloque, podría ser mejor usarmap
en cambio.– antonbormotov
5 de diciembre de 2018 a las 10:47
-
¡Esto no funciona como está y no admite direcciones IPv6!
– LassePoulsen
22 de julio de 2020 a las 9:01
-
@LassePoulsen sí, esta expresión regular solo funciona para ipv4, pero estoy seguro de que sería posible modificarla para ipv6. ¿Qué más no está funcionando “como está”?
– Fredrik
22 de julio de 2020 a las 11:19
antonbormotov
Una adición a la respuesta de @ fredrik.
Tal vez sea mejor establecer $real_ip
usando map
directiva:
map $http_x_forwarded_for $real_ip {
~^(\d+\.\d+\.\d+\.\d+) $1;
default $remote_addr;
}
Luego, establezca fastcgi_param REMOTE_ADDR
en fastcgi_params
archivo o un bloque de ubicación:
fastcgi_param REMOTE_ADDR $real_ip;
editar: error tipográfico corregido en el nombre de la variable
Resolví mi propio problema, dado que PHP se filtra a través de FastCGI, simplemente agregué un parámetro CGI rápido que configuró REMOTE_ADDR
a la variable http_x_forwarded_for
entonces algo similar a esto:
fastcgi_param REMOTE_ADDR $http_x_forwarded_for;