Как получить IP-адрес пользователя в контроллере Symfony2? - PullRequest
67 голосов
/ 27 января 2012

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

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

Ответы [ 5 ]

143 голосов
/ 27 января 2012

Вы можете получить IP-адрес клиента, используя услугу «Запрос»:

$this->container->get('request')->getClientIp();
46 голосов
/ 03 июня 2013

В 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();
17 голосов
/ 12 февраля 2013

К вашему сведению, по состоянию на Symfony 2.0 Request::getClientIp параметр $proxy равен устарел .Это будет удалено в Symfony 2.3.

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

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

или как @meze answer

$container->get('request')->getClientIp();
7 голосов
/ 08 апреля 2015

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

      $this->container->get('request_stack')->getCurrentRequest()->getClientIp();
2 голосов
/ 08 ноября 2016

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

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