2012-01-27 6 views

答えて

128

あなたが要求サービスを使用して、クライアントのIPを取得することができます:FYI

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

お返事ありがとうございます。$コンテナの由来を知ることができますか? – VishwaKumar

+14

これで作業しました: $ ip = $ this-> container-> get( 'request') - > getClientIp(); – VishwaKumar

17

、symfonyの2.0 Request::getClientIpのよう$proxyparameterdeprecatedです。 Symfony 2.3ではが削除されてになります。

あなたは

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

または@meze解答のみマスタ要求コントローラの内部symfonyの$this->container->get('request')->getClientIp() 2.3前の作品に

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

getClientIpの "proxy"引数のみが推奨されなくなりました。 https://github.com/symfony/symfony/compare/922c201..e5536f0.patch –

+0

答えを更新します。ありがとう – yvoyer

+1

私はREMOTE_ADDRの使用を推奨しません。あなたの開発マシンではローカルで動作するかもしれませんが、プロダクションアプリケーションの前にリバースプロキシやロードバランサがあれば、コードは壊れてしまいます。 getClientIp()はsymfonyでクライアントのIPを取得するための信頼できる唯一の方法です。 –

41

としてを使用することができます。サブリクエストコントローラでは、これは常に127.0.0.1を返します。あなたのプロジェクトでSymfony 2.2でサブリクエストが使用されている場合は、kernel.requestリスナを作成し、そこにマスターリクエストのIPを保存してください。 symfonyにおいて

2.3だから、あなたがリクエストからクライアントのIPアドレスを取得するためにtrusted_proxies設定パラメータに127.0.0.1を追加する必要がhttps://github.com/symfony/symfony/commit/2f3b33a630727cbc9cf21262817240a72a8dae0c を参照して、実際のIPは、プロキシのリストにプッシュされた内部サブリクエストのためのように、これは修正されましたSymfony 2.3以降ではサブリクエストが発生しますが、セキュリティ上の理由から共有ホスティングではこのようにしないでください。

はまた、127.0.0.1は組み込みのHTTPキャッシュ(web/app.phpAppCache)はsymfonyの2.3.20の前に使用された場合は、明示的にtrusted_proxiesに追加する必要がありました。このキャッシュは、実際のリバースプロキシのように見え、マスターリクエストのいくつかのヘッダーを変更します。 request_stackサービスを使用してのいずれかである現在の要求にアクセスするためにsymfonyの2.4ので3.xの好ましい方法でhttps://github.com/symfony/symfony/commit/902efb8a84e8f0acf6a63e09afa08e3dcdd80fb9

に固定

$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を除外する懸念が依然として適用されますが、b

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

私はSymfony 2.3.11を使っていますが、私のサブリクエストはまだ127.0.0.1を返します(私たちは組み込みのキャッシュを使用しています)ので、まだ修正されていないように見えます。 – Shinhan

+0

@Shinhan私は関連コードを調べて、彼らが別のアプローチを受け入れていることを発見しました。内部のサブリクエストは、内部のHTTPキャッシュと同じように動作するはずです。私は答えを更新しましたが、私は解決策をテストしていません。 –

+0

また、常に127.0.0.1を信頼する公開リクエストがあります:https://github.com/symfony/symfony/issues/9292 –

7

を使用してマスタ要求を参照しようとするかもしれません任意のサービスまたはメソッドの呼び出し:

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

これはすでにSymfony 2.4+のためのものです。 – Jonny

0

現在のクライアントIPを注入する別の方法もあります:symfonyはあなたのコントローラ内(次のコードを使用2.6+についてUTは今、あなたは明示的に

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

これは悪いアプローチです。より良い要求スタックをそれは自己とコンストラクタでIPをつかむ – Sharpy35

関連する問題