2012-09-15 10 views
5

दिखाता है मुझे PHP में $ _SERVER ['REMOTE_ADDR'] के साथ कोई समस्या आ रही है। यह आईपीवी 6 का उपयोग कर रहा है भले ही सर्वर आईपीवी 4 का उपयोग कर रहा हो।

क्या कोई इस समस्या को हल करने में मेरी सहायता कर सकता है।

+0

आप सुनिश्चित करें कि आपके सर्वर आईपीवी 4 पर चल रहा है कर रहे हैं? –

+2

ऐसा इसलिए है क्योंकि आपका वेब सर्वर बाध्यकारी है [::], 0.0.0.0 नहीं। –

उत्तर

15

सर्वर तब आईपीवी 6 सॉकेट पर कनेक्शन स्वीकार कर रहा है। कुछ ऑपरेटिंग सिस्टम आईपीवी 6 और आईपीवी 6 दोनों को आईपीवी 6 सॉकेट पर कर सकते हैं। जब ऐसा होता है तो IPv6 पता ::ffff:192.0.2.123 या ::ffff:c000:027b जैसा दिखाई देगा जो एक ही पता है लेकिन हेक्साडेसिमल में लिखा गया है।

आप 2a00:8640:1::224:36ff:feef:1d89 तरह IPv6 पतों तो आपके वेब सर्वर वास्तव में आईपीवी 6 से अधिक पहुंच योग्य वैसे भी है :-)

, वापस एक विहित प्रपत्र आप की तरह कुछ का उपयोग कर सकते करने के लिए सब कुछ परिवर्तित करने के लिए:

// Known prefix 
$v4mapped_prefix_hex = '00000000000000000000ffff'; 
$v4mapped_prefix_bin = pack("H*", $v4mapped_prefix_hex); 

// Or more readable when using PHP >= 5.4 
# $v4mapped_prefix_bin = hex2bin($v4mapped_prefix_hex); 

// Parse 
$addr = $_SERVER['REMOTE_ADDR']; 
$addr_bin = inet_pton($addr); 
if($addr_bin === FALSE) { 
    // Unparsable? How did they connect?!? 
    die('Invalid IP address'); 
} 

// Check prefix 
if(substr($addr_bin, 0, strlen($v4mapped_prefix_bin)) == $v4mapped_prefix_bin) { 
    // Strip prefix 
    $addr_bin = substr($addr_bin, strlen($v4mapped_prefix_bin)); 
} 

// Convert back to printable address in canonical form 
$addr = inet_ntop($addr_bin); 

इस कोड, जब आप इनपुट निम्न में से एक का उपयोग करना:

::ffff:192.000.002.123 
::ffff:192.0.2.123 
0000:0000:0000:0000:0000:ffff:c000:027b 
::ffff:c000:027b 
::ffff:c000:27b 
192.000.002.123 
192.0.2.123 

आप हमेशा कैनोनिका मिल एल IPv4 पता 192.0.2.123 आउटपुट के रूप में।

और हां IPv6 पतों के विहित IPv6 पतों के रूप में वापस हो: 2a00:8640:0001:0000:0224:36ff:feef:1d89 हो जाता है 2a00:8640:1::224:36ff:feef:1d89 आदि

+0

धन्यवाद। मैं आईपी फ़िल्टर करने के लिए कुछ करूँगा। – Brijesh

+0

मैंने आपके सभी उदाहरणों को मेरी टेस्ट स्क्रिप्ट में जोड़ने का प्रयास किया, और मैंने उपसर्ग की स्ट्रिपिंग निष्पादित नहीं की। क्या आपके सभी उदाहरणों के लिए आपके नमूना कोड में बहुत सारे 0 हैं? –

+0

नहीं, सभी उदाहरण वैध हैं। क्या आप अपनी टेस्ट स्क्रिप्ट दिखा सकते हैं? –

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