В 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();