2010-02-24 26 views
11

Tengo un sitio web configurado con nginx que actúa como un proxy inverso para Apache 2.2, que ejecuta php. Desde la perspectiva de apache y php, la dirección IP de todas las solicitudes es el servidor nginx. Me gustaría que php vea la misma IP remota que ve nginx.Cómo configurar REMOTE_ADDR en apache antes de llamar a php

Nginx establece un encabezado X-Real-IP que contiene la IP remota que ve nginx. He intentado hacer algo como esto en la configuración del Apache:

SetEnvIf ^X-Real-IP$ "(.+)" REMOTE_ADDR=$1 

Mi esperanza era que podía establecer la variable de entorno REMOTE_ADDR php y cuando finalmente se invoca, se vería el IP remota que Nginx ve. Creo que el código php está haciendo esto:

$_SERVER['REMOTE_ADDR'] 

De todos modos, esto no está funcionando. ¿Algunas ideas? ¿No puedes configurar REMOTE_ADDR en el archivo de configuración de apache? Gracias.

Respuesta

14

No estoy seguro de si REMOTE_ADDR se puede cambiar de esa manera ...


En realidad, es posible que tenga que instalar/habilitar otro módulo de Apache, como mod_rpaf(citando):

Se cambia la dirección remota del cliente visible para otros módulos Apache cuando se cumplen dos condiciones.
La primera condición es que el cliente remoto es en realidad un proxy que es definido en httpd.conf.
En segundo lugar, si hay una llamada entrante X-reenviado-Para cabecera y el proxy está en su lista de de poderes conocidos que se necesita la última IP de la entrada X-reenviado-Para cabecera y cambia la dirección remota de la cliente en la estructura de solicitud .
También toma el encabezado X-Host entrante y actualiza la configuración de host virtual en consecuencia.
Para Apache 2 mod_proxy que toma la cabecera X-forwared-Host y actualiza los VirtualHosts

Aquí está un blog post sobre eso: Nginx proxy to Apache - access remote host IP address using mod_praf

Actualización: enlace original no trabaja en este momento, pero está disponible también como un paquete Debian: apt-get install libapache2-mod-rpaf

+1

+1 ¡Agradable! Esto es bueno saberlo. Aunque el nombre del módulo suena como alguien golpeando a alguien en la mejilla en un lenguaje de caricatura :) –

+0

Como nota al margen: nunca había oído hablar de ese módulo; no estoy seguro si está bien soportado/estable/mantenido/... ;; * nah, el nombre suena gracioso ^^ no necesariamente es algo malo * –

+0

Estoy seguro de que dado un montón de cómics "Inteligentes e Inteligentes", podría encontrar la palabra utilizada en una escena violenta en alguna parte. Para ilustrar: http://www.pekkagaiser.com/stuff/cleversmart.jpg (Es alemán, pero no importa). –

1

No sé si REMOTE_ADDR puede ser manipulado - que podría ser que no puede - pero usted debería ser capaz de controlar la cabecera X-real-IP dentro de PHP a través de algo así como

$ _SERVER ["HTTP_X_Real_IP"]

o similar - marque phpinfo() para la notación correcta.

Además, las variables de entorno de Apache establecidas en .htaccess deben estar visibles en PHP.

+0

Una corrección, debe ser $ _SERVER ["HTTP_X_REAL_IP"], distingue entre mayúsculas y minúsculas – duganets

0

Fuera del manguito ... pero ¿podría pasar el encabezado X-Real-IP como una variable para el php usando alguna magia de reescritura ..? ¿No puede htaccess hacer cosas con información del encabezado antes de invocar PHP?

2

Usted puede probar este módulo PHP sencilla

https://github.com/yohgaki/realip

Simplemente reescribe $ _SERVER [ 'REMOTE_ADDR'] con X-reenviado-A o X-real-IP lo que sea cabecera te gusta. Puedes lograr esto con muchos métodos diferentes, pero solo me gustaría hacerlo como módulo de PHP. Entonces lo escribí.

6

Lo he resuelto usando mod_remoteip para Apache. mod_remoteip es para Apache 2.5 pero gracias a this guy también puedes usarlo en Apache 2.2.x.

Descargar mod_remoteip.c de https://gist.github.com/1042237 y compilarlo con

apxs -i -a -c mod_remoteip.c 

Esto debería crear mod_remoteip.so copia en el directorio de módulos. apxs también agregará la directiva LoadModule en su httpd.conf para el módulo recién creado.

httpd.conf abrir y comprobar hace directiva LoadModule para mod_remoteip existe

LoadModule remoteip_module modules/mod_remoteip.so 

Añadir Directiva RemoteIPHeader en httpd.conf

RemoteIPHeader X-Forwarded-For 

Esta directiva instruirá mod_remoteip para utilizar el valor X-reenviado-A desde nginx como remote_addr. También puede usar X-Real-IP en su lugar:

RemoteIPHeader X-Real-IP 

Reinicie el Apache. Si ha establecido las cabeceras del proxy en nginx que funcionará como un encanto y remote_addr en Apache será correcta

# nginx conf  
proxy_set_header X-Real-IP $remote_addr; 
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
+3

Pero parece hay un problema si usas mod_rewrite. Las URL reescritas no tendrán correcta remote_addr :( – mileusna

+1

mod_remoteip tiene un defecto y no funciona con mod_rewrite, es decir, en las URL reescritas todavía obtendrá el 127.0.0.1. Por lo tanto, al final, la única solución correcta que encontré es mod_rpaf. Compilarlo e instalarlo de manera similar a como lo describí para mod_remoteip – mileusna

1

Apache (requiere módulo mod_headers):

SetEnvIf X-Real-IP "^(\d{1,3}+\.\d{1,3}+\.\d{1,3}+\.\d{1,3}+).*" XFF_CLIENT_IP=$1 
RequestHeader set REMOTE_ADDR %{XFF_CLIENT_IP}e 

REF para SetEnvIf RegEx: https://stackoverflow.com/a/10346093

obras también, pero no verifica entrada como IP:

SetEnvIf X-Real-IP "^(.*)" XFF_CLIENT_IP=$1 
RequestHeader set REMOTE_ADDR %{XFF_CLIENT_IP}e 

En PHP:

$_SERVER["HTTP_REMOTE_ADDR"] 

-o-

$_SERVER["REMOTE_ADDR"] 

No hay módulos no esenciales Apache requeridos

+3

No establece REMOTE_ADDR, solo HTTP_REMOTE_ADDR (apache 2.2). – user1050755

1

mod_rpaf (sudo apt-get install libapache2-mod-rPAF)

resolvió todos los problemas y REMOTE_ADDRR ahora se ve bien!

Cuestiones relacionadas