2012-01-27 15 views
55

मुझे फॉर्म जमा करने के बाद डेटाबेस में टिप्पणी करने वाले उपयोगकर्ताओं के आईपी पते को स्टोर करने की आवश्यकता है।मैं Symfony2 नियंत्रक में उपयोगकर्ता आईपी पता कैसे प्राप्त करूं?

क्या आईपी प्राप्त करने के लिए कोई symfony2 फ़ंक्शन है? या आईपी पाने के लिए कोई और तरीका?

उत्तर

128

आप क्लाइंट IP का उपयोग कर अनुरोध सेवा प्राप्त कर सकते हैं:

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

त्वरित प्रतिक्रिया के लिए धन्यवाद।क्या मुझे पता है कि $ कंटेनर क्या है। – VishwaKumar

+14

ठीक है यह इस द्वारा काम कर रहा है: $ आईपी = $ यह-> कंटेनर-> प्राप्त करें ('अनुरोध') -> getClientIp(); – VishwaKumar

17

FYI करें, Symfony 2.0 की Request::getClientIp$proxyparameterdeprecated है। यह सिम्फनी 2.3 में हटा दिया जाएगा।

आप

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

उपयोग कर सकते हैं या @meze जवाब

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

getClientIp को केवल "प्रॉक्सी" तर्क को बहिष्कृत कर दिया गया है। https://github.com/symfony/symfony/compare/922c201...e5536f0.patch –

+0

मैं अपना उत्तर अपडेट करता हूं। धन्यवाद – yvoyer

+1

मैं कभी भी REMOTE_ADDR के उपयोग की अनुशंसा नहीं करता हूं। यह आपकी देव मशीन पर स्थानीय रूप से काम कर सकता है, लेकिन यदि आपके उत्पादन अनुप्रयोग में इसके विपरीत रिवर्स प्रॉक्सी या लोड बैलेंसर है, तो आपका कोड टूट जाएगा। getClientIp() सिम्फनी में अपने क्लाइंट के आईपी को प्राप्त करने का एकमात्र भरोसेमंद तरीका है। –

41

Symfony में पहले ही की मास्टर अनुरोध नियंत्रक के अंदर 2.3$this->container->get('request')->getClientIp() काम करता है के रूप में। उप-अनुरोध नियंत्रक में यह हमेशा 127.0.0.1 देता है। यदि आपकी प्रोजेक्ट सिम्फनी 2.2 के साथ उप-अनुरोधों का उपयोग करती है, तो बुलेट प्रूफ समाधान kernel.request श्रोता बनाने और आईपी को मास्टर अनुरोध से सहेजना है।

Symfony में 2.3 इस तय किया गया था आंतरिक उप अनुरोध असली आईपी प्रॉक्सी की सूची में धकेल दिया जाता है के लिए हां, तो https://github.com/symfony/symfony/commit/2f3b33a630727cbc9cf21262817240a72a8dae0c देख तो तुम में अनुरोध से ग्राहक आईपी पाने के लिए trusted_proxies विन्यास पैरामीटर के लिए 127.0.0.1 जोड़ने की जरूरत सिम्फनी 2.3+ में उप-अनुरोध, लेकिन आपको सुरक्षा कारणों से साझा होस्टिंग पर ऐसा नहीं करना चाहिए।

इसके अलावा, 127.0.0.1 स्पष्ट रूप से अगर निर्मित HTTP कैश (web/app.php में AppCache) Symfony 2.3.20 से पहले इस्तेमाल किया गया था trusted_proxies को जोड़ा जाना था। यह कैश वास्तविक रिवर्स-प्रॉक्सी की तरह दिखने की कोशिश करता है और मास्टर अनुरोध के कुछ शीर्षकों को संशोधित करता है। वर्तमान अनुरोध तक पहुँचने के लिए request_stack सेवा का उपयोग कर या तो है https://github.com/symfony/symfony/commit/902efb8a84e8f0acf6a63e09afa08e3dcdd80fb9

में फिक्स्ड Symfony 2.4 के बाद से और 3.x पसंदीदा तरीका में

$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 को छोड़ने की चिंता अभी भी लागू होती है, बी ut अब आप Symfony 2.6+ निम्नलिखित कोड (अपने नियंत्रक के भीतर उपयोग के लिए स्पष्ट रूप से

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

मैं सिम्फनी 2.3.11 का उपयोग कर रहा हूं लेकिन मेरी सबक्वेक्स्ट अभी भी 127.0.0.1 (हम अंतर्निहित कैशिंग का उपयोग कर रहे हैं) लौट रहे हैं, इसलिए ऐसा लगता है कि यह अभी भी तय नहीं है। – Shinhan

+0

@ शिनहान मैंने संबंधित कोड में देखा है और पाया है कि उन्होंने एक और दृष्टिकोण स्वीकार कर लिया है। अब आंतरिक उप-अनुरोधों को आंतरिक HTTP कैश के समान काम करना चाहिए। मैंने जवाब अपडेट कर लिया है, लेकिन मैंने समाधान का परीक्षण नहीं किया है। –

+0

हमेशा 127.0.0.1 पर भरोसा करने का एक खुला अनुरोध भी है: https://github.com/symfony/symfony/issues/9292 –

7

का उपयोग कर मास्टर अनुरोध का उल्लेख करने की कोशिश कर सकते हैं:

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

यह सिम्फनी 2.4+ पहले से ही वास्तव में है। – Jonny

0

वहाँ भी एक और तरीका मौजूदा ग्राहक आईपी इंजेक्षन करने के लिए है किसी भी सेवा या विधि कॉल में:

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

यह एक बुरा दृष्टिकोण है। अनुरोध को बेहतर इंजेक्ट करें इसे स्वयं ढेर करें और कन्स्ट्रक्टर में आईपी पकड़ो – Sharpy35

संबंधित मुद्दे