PHP में सर्वर आईपी एड्रेस की पहचान कैसे करें


122

मैं PHP में सर्वर आईपी पते की पहचान कैसे कर सकता हूं?


2
क्या आपके अनुरोध का अर्थ है आईपी पता या आपके ऐप से चलने वाली मशीन का आईपी?
wosis

जवाबों:


175

सर्वर आईपी के लिए इस तरह:

$_SERVER['SERVER_ADDR'];

और इस बंदरगाह के लिए

$_SERVER['SERVER_PORT'];

9
कुछ साझा होस्ट पर यह रिटर्न :: 1
TheRealChx101

3
यह आपके वेब सर्वर के सामने उपयोग किए जा रहे लोड बैलेंसर के आधार पर गलत हो सकता है। आप इस परिदृश्य में
X- फ़ॉर्वर्ड

31
यह सर्वर का पता नहीं है! यह वह पता है जो रिमोट ब्राउज़र सर्वर को कॉल करता है, जो रिमोट उपयोगकर्ता के नियंत्रण में है। John Kइसके बजाय उत्तर का उपयोग करें
एरियल

यह सर्वर को आईपी नहीं देता है। किसी कारण से यह मेरे स्थानीय आईपी
थॉमस विलियम्स

यह php-fpm सर्वर एड्रेस भी नहीं देता है, लेकिन यह संबंधित वेब सर्वर (nginx, apache) के लिए है। इसलिए यह mysql- क्लाइंट होस्ट विनिर्देशन (उपयोगकर्ता @ होस्ट) के लिए सही नहीं होगा।
scipilot

105

यदि आप PHP संस्करण 5.3 या उच्चतर का उपयोग कर रहे हैं, तो आप निम्न कार्य कर सकते हैं:

$host= gethostname();
$ip = gethostbyname($host);

जब आप स्टैंड-अलोन स्क्रिप्ट चला रहे होते हैं, तो यह वेब सर्वर के माध्यम से नहीं चल रहा होता है।


बिल्कुल सही, मैं क्या देख रहा हूँ। धन्यवाद जॉन
फ्रैंक

6
+1 यह एकमात्र समाधान है जो कमांड लाइन के साथ काम करेगा।
एडम एल्सोडेनी

2
@andreas यह नहीं होना चाहिए स्थानीय होस्टनाम /etc/hostsफ़ाइल में होना चाहिए और तेज़ होगा - हालाँकि यह अभी हो सकता है 127.0.0.1। अगर इसे DNS को कॉल करना है तो यह आपके कहे अनुसार धीमा होगा।
एरियल

+1 लेकिन बस एक सवाल है। मैं इसे एक स्थानीय सर्वर पर xampp के साथ आज़माता हूं और यह IP 192.168etc लौटाता है लेकिन .. यह 127.0.0.1 नहीं होना चाहिए ??
एंड्रिया बोरी

यह मेरे लिए काम करता है लेकिन कुछ मशीन अपने डोमेन नाम दिखा रही है। इस समस्या को कैसे सुधारें।
धारिणी धरना

19

उदाहरण के लिए:

$_SERVER['SERVER_ADDR']

जब आपका IIS पर, प्रयास करें:

$_SERVER['LOCAL_ADDR']

2
$_SERVER['LOCAL_ADDR']केवल IIS के तहत उपलब्ध है जब PHP एक CGI मॉड्यूल के रूप में चल रहा है।
रूडी विसेर

@rudi_visser यह Fastcgi के साथ भी काम करता है, लेकिन जब आप locahost से जुड़ते हैं, तो आपको इसके बजाय :: 1 वापस मिल जाता है। यदि आप सर्वर के नाम या आईपी से जुड़ते हैं, तो आपको असली आईपी वापस मिल जाता है।
स्टारबिम्रेनबोलाब्स

@starbeamrainbowlabs FastCGI है सीजीआई :) मैं एक ISAPI मॉड्यूल के रूप में चल रहा है के विपरीत मतलब, यह एक स्थिर मंच के रूप में FastCGI के प्रमुख आगमन से पहले लिखा गया था।
रूडी विसेर

@starbeamrainbowlabs जो कुछ भी दिखता है :: 1 शायद एक IP6 पता है
टोबी एलन

@TobyAllen धन्यवाद :)। अजीब बात यह है कि मेरा नेटवर्क ipv6 का समर्थन नहीं करता है, फिर भी मेरा सर्वर (विंडोज़ 7 मशीन) अपने आईपी को :: 1, ipv6 लूपबैक पते के रूप में रिपोर्ट करता है।
स्टारबेम्रेनबोल्ब्स

13

मैं इस पृष्ठ पर आया था कि मुझे अपना आईपी पता प्राप्त करने का एक तरीका मिल रहा था, जो दूरस्थ मशीन से कनेक्ट नहीं था।

यह विंडोज़ मशीन के लिए काम नहीं करेगा।

लेकिन मामले में किसी को मैं क्या देख रहा था के लिए खोज करता है:

#! /usr/bin/php
<?php
$my_current_ip=exec("ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'");
echo $my_current_ip;

(बेशर्मी से कैसे मैं लिनक्स और ओएस एक्स पर स्थानीय मशीन का प्राथमिक आईपी पता प्राप्त कर सकता हूं? )


यह एकमात्र विकल्प है जो वास्तव में शेल से PHP स्क्रिप्ट को चलाने के दौरान काम करता है। प्रश्न: जब कई सक्रिय इंटरफेस होते हैं, तो यह कैसे तय करता है कि किस पते पर वापस लौटना है? मैंने वायर्ड और वायरलेस ईथरनेट कनेक्शन के साथ सक्रिय परीक्षण किया, और फिर केवल वायरलेस सक्रिय के साथ, और यह दोनों बार wlan आईपी लौटाता है। अच्छी स्क्रिप्ट, धन्यवाद!
रयान ग्रिग्स

यह वास्तव में नहीं जानता कि किसको वापस लौटना है। यह ifconfig के आउटपुट से अंतिम इनसेट इंटरफ़ेस लौटाता है, लेकिन 127.0.0.1 को अनदेखा करता है। यदि आपके पास केवल "सामान्य" इंटरफेस है, तो यह बहुत अच्छा काम करता है। यह संभवत: सबसे सुरक्षित है यदि आप इच्छित इंटरफ़ेस निर्दिष्ट करते हैं "ifconfig wlan0 | ..."। यह स्क्रिप्ट किसी भी तरह से सही नहीं है, लेकिन यह सरल सेटिंग्स में काम करता है और यह दर्शाता है कि सिद्धांत रूप में यह कैसे करना है, आवश्यकतानुसार समायोजित किया जाना चाहिए।
डोम

1
ifconfig | grep 'inet addr' | cut -d ':' -f 2 | awk '{प्रिंट $ 1}' | grep -vE '^ (192 \ _168 | 10 \। | 172 \ _। [[67]] \ _ | 172 \ .2 [0-9] \ _ | 172 \ _। [[01] \ _। 127 \ _ ) 'यह मेरा नवीनतम संशोधन है। यह सभी स्थानीय कूल्हों को फ़िल्टर करता है और केवल आपको एक्सटर्नल देता है
डोम

मेरे पास कई नेटवर्क इंटरफेस हैं इसलिए मैंने कियाifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1' | grep -e '192\.168\.1\.'
जोनाथन

10

अधिकांश अप-वोट किए गए उत्तरों में से कोई भी सर्वर के सार्वजनिक पते को मज़बूती से वापस नहीं करेगा। आम तौर पर $_SERVER['SERVER_ADDR']सही होगा, लेकिन अगर आप वीपीएन के माध्यम से सर्वर तक पहुंच रहे हैं, तो यह संभवतः सार्वजनिक पते के बजाय आंतरिक नेटवर्क पते को वापस कर देगा, और यहां तक ​​कि जब एक ही नेटवर्क पर नहीं तो कुछ कॉन्फ़िगरेशन केवल रिक्त होंगे या कुछ अन्य निर्दिष्ट होंगे मूल्य।

इसी तरह, ऐसे परिदृश्य $host= gethostname(); $ip = gethostbyname($host);हैं जो सही मान नहीं लौटाएंगे क्योंकि यह दोनों DNS (या तो आंतरिक रूप से कॉन्फ़िगर या बाहरी रिकॉर्ड) पर निर्भर है और सर्वर के होस्टनाम सेटिंग्स को सर्वर के आईपी पते को एक्सट्रपलेट करने के लिए है। ये दोनों कदम संभावित रूप से दोषपूर्ण हैं। उदाहरण के लिए, यदि सर्वर का होस्टनाम एक डोमेन नाम (यानी HOSTNAME=yahoo.com) की तरह स्वरूपित है, तो (कम से कम मेरे php5.4 / Centos6 सेटअप पर) gethostbynameस्थानीय सर्वर के बजाय Yahoo.com के पते को खोजने के लिए सीधे छोड़ देगा।

इसके अलावा, क्योंकि gethostbynameसार्वजनिक DNS पर वापस आता है अप्रकाशित या गलत सार्वजनिक DNS रिकॉर्ड के साथ एक परीक्षण सर्वर रिकॉर्ड करता है (उदाहरण के लिए, आप सर्वर को localhostआईपी ​​पते से या यदि आप अपनी स्थानीय hostsफ़ाइल का उपयोग करके सार्वजनिक DNS को ओवरराइड कर रहे हैं ) तो आप ' वापस कोई भी IP पता नहीं मिलेगा (यह सिर्फ hostname लौटाएगा) या इससे भी बदतर यह सार्वजनिक DNS रिकॉर्ड में निर्दिष्ट गलत पता वापस कर देगा यदि कोई मौजूद है या यदि डोमेन के लिए वाइल्डकार्ड है।

स्थिति के आधार पर, आप कुछ ऐसा करके तीसरे दृष्टिकोण की कोशिश कर सकते हैं:

$external_ip = exec('curl http://ipecho.net/plain; echo');

इसकी अपनी खामियां हैं (एक विशिष्ट तृतीय-पक्ष साइट पर निर्भर है, और नेटवर्क सेटिंग्स हो सकती हैं जो एक अलग होस्ट या प्रॉक्सी के माध्यम से आउटबाउंड कनेक्शन को रूट करती हैं) और जैसे gethostbynameयह धीमा हो सकता है। मुझे ईमानदारी से यकीन नहीं है कि कौन सा दृष्टिकोण सबसे अधिक बार सही होगा, लेकिन दिल से सबक लेने के लिए यह है कि विशिष्ट परिदृश्य / कॉन्फ़िगरेशन इन सभी दृष्टिकोणों के लिए गलत आउटपुट होंगे ... इसलिए यदि संभव हो तो सत्यापित करें कि दृष्टिकोण आप कर रहे हैं उपयोग उन मूल्यों को वापस कर रहा है जो आप अपेक्षा करते हैं।


9

यह वही है जो आप अपने सर्वर पर स्थापित कर्ल के बारे में चिंता किए बिना उपरोक्त उदाहरणों के अनुकूलन के रूप में उपयोग कर सकते हैं।

<?php
      // create a new cURL resource
      $ch = curl_init ();

      // set URL and other appropriate options
      curl_setopt ($ch, CURLOPT_URL, "http://ipecho.net/plain");
      curl_setopt ($ch, CURLOPT_HEADER, 0);
      curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);

      // grab URL and pass it to the browser

      $ip = curl_exec ($ch);
      echo "The public ip for this server is: $ip";
      // close cURL resource, and free up system resources
      curl_close ($ch);
    ?>


5

यदि आप bash शेल में PHP का उपयोग कर रहे हैं तो आप उपयोग कर सकते हैं:

$server_name=exec('hostname');

क्योंकि $_SERVER[] SERVER_ADDR, HTTP_HOSTऔर SERVER_NAMEसेट नहीं हैं।


4

पिछले उत्तर सभी $ _SERVER ['SERVER_ADDR'] देते हैं। यह कुछ IIS स्थापनाओं पर काम नहीं करेगा। यदि आप IIS पर काम करना चाहते हैं, तो निम्नलिखित का उपयोग करें:

$server_ip = gethostbyname($_SERVER['SERVER_NAME']);

2

मुझे यह मेरे लिए काम करने के लिए मिला: GetHostByName ("");

Windows 7 पर अपाचे वेबसर्वर चल XAMPP v1.7.1। दुर्भाग्य से यह सिर्फ मेरा गेटवे आईपी पता देता है।


2

मैंने अभी एक साधारण स्क्रिप्ट बनाई है जो $ _SERVER ['REMOTE_ADDR'] और $ _SERVER ['SERVER_ADDR'] को IIS में वापस लाएगी ताकि आपको हर चर को बदलना न पड़े। बस इस पाठ को अपनी php फ़ाइल में पेस्ट करें जो हर पेज में शामिल है।

/** IIS IP Check **/
if(!$_SERVER['SERVER_ADDR']){ $_SERVER['SERVER_ADDR'] = $_SERVER['LOCAL_ADDR']; }
if(!$_SERVER['REMOTE_ADDR']){ $_SERVER['REMOTE_ADDR'] = $_SERVER['LOCAL_ADDR']; }


1

$HTTP_SERVER_VARS['server_ADDR']यदि आपको उपरोक्त उत्तरों से कुछ नहीं मिल रहा है और यदि आप PHP के पुराने संस्करण का उपयोग कर रहे हैं, तो आपको इसका उपयोग करना पड़ सकता है


0

$ _SERVER सरणी की जाँच करें

echo $_SERVER['SERVER_ADDR'];

1
यह "असली आईपी" नहीं खोजता है, यह मनमाना, असत्यापित एचटीटीपी हेडर किसी को भी सेट कर सकता है और यदि आप उन्हें पसंद करते हैं तो कोई भी उनके आईपी को खराब करने के लिए उपयोग कर सकता है। यदि क्लाइंट एक प्रॉक्सी के पीछे है तो ऐसा हो, किसी भी HTTP हेडर पर भरोसा न करें। यह भी सवाल बिल्कुल फिट नहीं है।
deceze

2
यह पता नहीं लगाया जा सकता है कि यह उत्तर किस तरह से इस सवाल पर फिट नहीं बैठता है। सवाल था: "मैं PHP में सर्वर आईपी पते की पहचान कैसे कर सकता हूं?"। या तो ओपी को सीखना चाहिए कि बेहतर कैसे पूछें, या क्या आपको सीखना चाहिए कि प्रश्न कैसे पढ़ें। इसके अलावा, यदि क्लाइंट एक प्रॉक्सी के पीछे है, तो आप अभी भी खराब कर रहे हैं चाहे आप सर्वर-साइड से कोशिश करें। एक पूरी तरह से अलग परिदृश्य तब होता है जब सर्वर प्रॉक्सी के पीछे होता है, क्योंकि आप एक्स-फॉरवर्डेड-फॉर हेडर्स के साथ जांच कर सकते हैं।
लुइस मूसली

@ हेडसे का $_SERVER["SERVER_ADDR"]HTTP हेडर से कोई लेना देना नहीं है। यह सर्वर सॉफ्टवेयर द्वारा भरा गया है, $ _SERVER में सभी HTTP संबंधित सामान HTTP_ के साथ पूर्वनिर्मित है। php.net/manual/en/reserved.variables.server.php
poncha

@poncha मेरी टिप्पणी इस पोस्ट के मूल संशोधन से संबंधित है ।
deceze

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.