2012-09-15 58 views
5

我正在面對PHP 中的$ _SERVER ['REMOTE_ADDR']的問題即使服務器使用IPv4,它也會給出與IPv6類似的值。

任何人都可以幫助我解決這個問題。

+0

你確定你的服務器上運行的IPv4? –

+2

這是因爲您的Web服務器綁定到[::],而不是0.0.0.0。 –

回答

15

服務器正在接受IPv6套接字上的連接。某些操作系統可以在IPv6套接字上同時執行IPv4和IPv6。當發生這種情況時,IPv6地址將看起來像是::ffff:192.0.2.123::ffff:c000:027b,這是相同的地址,但是以十六進制寫入。

如果你看到這樣2a00:8640:1::224:36ff:feef:1d89 IPv6地址,那麼你的服務器真的可達通過IPv6 :-)

無論如何,一切都重新轉換爲規範的形式,你可以使用類似:

// 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 

你總是得到卡諾尼卡l IPv4地址192.0.2.123作爲輸出。

當然IPv6地址,並得到恢復,作爲典型的IPv6地址:2a00:8640:0001:0000:0224:36ff:feef:1d89成爲2a00:8640:1::224:36ff:feef:1d89

+0

謝謝。我會做一些過濾IP。 – Brijesh

+0

我試着將所有的例子添加到我的測試腳本中,並且我從不執行前綴的條紋。您的示例代碼中是否有太多的0代表您的所有示例? –

+0

不,所有的例子都是有效的。你能顯示你的測試腳本嗎? –

相關問題