Подтвердить что ты не робот

Как получить IP-адрес пользователя в контроллере Symfony2?

Мне нужно сохранить IP-адрес пользователей, которые комментируют, в базе данных после отправки формы.

Есть ли какая-либо функция symfony2 для получения IP? Или любой другой способ получить IP?

4b9b3361

Ответ 1

Вы можете получить IP-адрес клиента с помощью службы запроса:

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

Ответ 2

В Symfony до 2.3 $this->container->get('request')->getClientIp() работает только внутри контроллера основного запроса. В подчиненном контроллере всегда возвращается 127.0.0.1. Если ваш проект использует подзапросы с Symfony 2.2, пуленепробиваемым решением является создание kernel.request прослушивателя и сохранение IP-адреса из основного запроса в нем.

В Symfony 2.3 это было исправлено, поэтому для внутренних подпроцессов реальный IP-адрес переводится в список прокси-серверов, см. https://github.com/symfony/symfony/commit/2f3b33a630727cbc9cf21262817240a72a8dae0c Поэтому вам нужно добавить параметр конфигурации 127.0.0.1 в trusted_proxies, чтобы получить клиентский ip из запроса в подзапросах в Symfony 2.3+, но вы не должны этого делать на общем хостинге по соображениям безопасности.

Кроме того, 127.0.0.1 должен был быть добавлен в trusted_proxies явно, если встроенный HTTP-кеш (AppCache в web/app.php) использовался до Symfony 2.3.20. Этот кеш пытается выглядеть как реальный обратный прокси и изменяет некоторые заголовки главного запроса. Исправлено в https://github.com/symfony/symfony/commit/902efb8a84e8f0acf6a63e09afa08e3dcdd80fb9

С Symfony 2.4 и в 3.x предпочтительный способ доступа к текущему запросу - либо использовать request_stack service

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

или ввод запроса в контроллер, см. http://symfony.com/doc/current/book/controller.html#the-request-as-a-controller-argument

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

Но проблема по поводу исключения 127.0.0.1 при использовании в подзапросах все еще применяется, но теперь вы можете попытаться явно ссылаться на главный запрос, используя

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

Ответ 3

FYI, Начиная с Symfony 2.0 Request::getClientIp параметр $proxy устаревший. Он будет удален в Symfony 2.3.

Вы можете использовать

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

или как @meze answer

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

Ответ 4

Для Symfony 2.6+ используйте следующий код (в вашем контроллере:

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

Ответ 5

есть еще один способ вставить текущий IP-адрес клиента в любой вызов службы или метода:

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