コメントを投稿したユーザーのIPアドレスをフォームの送信後にデータベースに保存する必要があります。Symfony2コントローラでユーザのIPアドレスを取得するにはどうすればよいですか?
IPを取得するsymfony2関数はありますか?またはIPを取得する他の方法は?
コメントを投稿したユーザーのIPアドレスをフォームの送信後にデータベースに保存する必要があります。Symfony2コントローラでユーザのIPアドレスを取得するにはどうすればよいですか?
IPを取得するsymfony2関数はありますか?またはIPを取得する他の方法は?
あなたが要求サービスを使用して、クライアントのIPを取得することができます:FYI
$this->container->get('request')->getClientIp();
、symfonyの2.0 のようRequest::getClientIp
$proxy
parameterはdeprecatedです。 Symfony 2.3ではが削除されてになります。
あなたは
$container->get('request')->server->get("REMOTE_ADDR");
または@meze解答のみマスタ要求コントローラの内部symfonyの$this->container->get('request')->getClientIp()
2.3前の作品に
$container->get('request')->getClientIp();
getClientIpの "proxy"引数のみが推奨されなくなりました。 https://github.com/symfony/symfony/compare/922c201..e5536f0.patch –
答えを更新します。ありがとう – yvoyer
私はREMOTE_ADDRの使用を推奨しません。あなたの開発マシンではローカルで動作するかもしれませんが、プロダクションアプリケーションの前にリバースプロキシやロードバランサがあれば、コードは壊れてしまいます。 getClientIp()はsymfonyでクライアントのIPを取得するための信頼できる唯一の方法です。 –
としてを使用することができます。サブリクエストコントローラでは、これは常に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.php
でAppCache
)は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();
私はSymfony 2.3.11を使っていますが、私のサブリクエストはまだ127.0.0.1を返します(私たちは組み込みのキャッシュを使用しています)ので、まだ修正されていないように見えます。 – Shinhan
@Shinhan私は関連コードを調べて、彼らが別のアプローチを受け入れていることを発見しました。内部のサブリクエストは、内部のHTTPキャッシュと同じように動作するはずです。私は答えを更新しましたが、私は解決策をテストしていません。 –
また、常に127.0.0.1を信頼する公開リクエストがあります:https://github.com/symfony/symfony/issues/9292 –
を使用してマスタ要求を参照しようとするかもしれません任意のサービスまたはメソッドの呼び出し:
acme.currentIP:
class: some\service\className
arguments:
- "@=service('request_stack').getCurrentRequest().getClientIp()"
これはすでにSymfony 2.4+のためのものです。 – Jonny
現在のクライアントIPを注入する別の方法もあります:symfonyはあなたのコントローラ内(次のコードを使用2.6+についてUTは今、あなたは明示的に
$this->container->get('request_stack')->getMasterRequest()->getClientIp();
これは悪いアプローチです。より良い要求スタックをそれは自己とコンストラクタでIPをつかむ – Sharpy35
お返事ありがとうございます。$コンテナの由来を知ることができますか? – VishwaKumar
これで作業しました: $ ip = $ this-> container-> get( 'request') - > getClientIp(); – VishwaKumar