2012-01-27 19 views

Respuesta

128

Usted puede obtener la IP del cliente utilizando el servicio de pedidos:

$this->container->get('request')->getClientIp(); 
+0

Gracias por la respuesta rápida.¿Puedo saber de qué viene $ contenedor? – VishwaKumar

+14

Ok, funcionó esto: $ ip = $ this-> container-> get ('request') -> getClientIp(); – VishwaKumar

17

FYI, A partir de Symfony 2.0 Request::getClientIp la $proxyparameter es deprecated. Será eliminado en Symfony 2.3.

Puede utilizar

$container->get('request')->server->get("REMOTE_ADDR"); 

o como respuesta @meze

$container->get('request')->getClientIp(); 
+0

Solo se ha desaprobado el argumento "proxy" para getClientIp. https://github.com/symfony/symfony/compare/922c201...e5536f0.patch –

+0

Actualizo mi respuesta. Gracias – yvoyer

+1

Nunca recomiendo el uso de REMOTE_ADDR. Puede funcionar localmente en su máquina de desarrollo, pero si su aplicación de producción tiene algún tipo de proxy inverso o balanceador de carga frente a él, su código se romperá. getClientIp() es la única forma confiable de obtener la IP de su cliente en Symfony. –

41

En Symfony 2.3 antes$this->container->get('request')->getClientIp() sólo funciona dentro del controlador maestro solicitud. En el controlador de sub petición, siempre devuelve 127.0.0.1. En caso de que su proyecto use sub-solicitudes con Symfony 2.2, la solución a prueba de balas es crear el oyente kernel.request y guardar la IP de la solicitud maestra en él.

En Symfony 2.3 lo arreglaron así que para sub-solicitudes internas del IP real es empujado a la lista de servidores proxy, consulte https://github.com/symfony/symfony/commit/2f3b33a630727cbc9cf21262817240a72a8dae0c Así que hay que añadir 127.0.0.1 al parámetro de configuración trusted_proxies para obtener IP del cliente de la solicitud de sub-solicitudes en Symfony 2.3+, pero no debe hacer esto en el alojamiento compartido por razones de seguridad.

Además, 127.0.0.1 tuvieron que ser añadido a trusted_proxies explícitamente si se utilizó antes de Symfony 2.3.20 incorporado en la memoria caché HTTP (AppCache en web/app.php). Este caché intenta parecerse a un proxy inverso real y modifica algunos encabezados de la solicitud maestra. Fijo en https://github.com/symfony/symfony/commit/902efb8a84e8f0acf6a63e09afa08e3dcdd80fb9

Desde Symfony 2,4 y en 3.x la forma preferida de la petición de acceso actual es o bien utilizando request_stack servicio

$this->container->get('request_stack')->getCurrentRequest()->getClientIp(); 

o inyectar Solicitud en el controlador, ver http://symfony.com/doc/current/book/controller.html#the-request-as-a-controller-argument

public function indexAction(Request $request) 
{ 
    $ip = $request->getClientIp(); 
} 

Pero la preocupación por excluir 127.0.0.1 cuando se usa en las solicitudes secundarias aún se aplica, b ut ahora usted puede tratar de hacer referencia explícita a la petición maestro usando

$this->container->get('request_stack')->getMasterRequest()->getClientIp(); 
+0

Estoy usando Symfony 2.3.11 pero mis subreques aún devuelven 127.0.0.1 (no estamos usando el almacenamiento en caché integrado), por lo que me parece que todavía no está solucionado. – Shinhan

+0

@Shinhan He investigado el código relacionado y descubrí que han aceptado otro enfoque. Ahora las sub-solicitudes internas deberían funcionar de la misma manera que la caché HTTP interna. He actualizado la respuesta, pero no he probado la solución. –

+0

También hay una solicitud abierta para confiar siempre en 127.0.0.1: https://github.com/symfony/symfony/issues/9292 –

7

Para Symfony 2.6+ usar el siguiente código (dentro de su controlador:

 $this->container->get('request_stack')->getCurrentRequest()->getClientIp(); 
+0

Eso es para Symfony 2.4+ ya en realidad. – Jonny

0

también hay otra manera de inyectar el cliente actual IP en cualquier servicio o método llame al:

acme.currentIP: 
    class: some\service\className 
    arguments: 
     - "@=service('request_stack').getCurrentRequest().getClientIp()" 
+2

este es un mal enfoque. Mejor inyecte la pila de solicitudes y tome la ip en el constructor – Sharpy35

Cuestiones relacionadas