2011-05-23 1847 views
8

可能重複:
suddenly $_SERVER['REMOTE_ADDR'] is started returning 10.10.10.10 php

我必須在這裏漏掉了一些根本的東西。但是,當我瀏覽到一個IP顯示的網站如http://www.whatsmyip.org/他們表現出一定的IP。但是,當我在我的網站上的頁面上呼出$_SERVER["REMOTE_ADDR"]時,它會顯示不同的IP。

這是爲什麼?我如何通過PHP獲取與whatsmyip.org網站顯示的IP相同的IP?

+0

什麼是您的服務器?你看到的是哪個IP?也許127.0.0.1或192.168.0.1或類似的東西。 – 2011-05-23 13:23:19

+0

您的PHP服務器是否在帶有重寫/代理配置的Apache前端後面運行? – 2011-05-23 13:23:25

+1

@OZ_我看到的ip不是127.0.0.1或192.168.0.1,它是一個「普通」IP。 – Weblurk 2011-05-23 13:36:34

回答

10

如果你的電腦是你的服務器在同一個網絡上,與NAT路由器後面,那麼你可能會看到您的私有IP

+0

這是真的,在一分鐘前測試過它 – k102 2011-05-23 13:26:45

0

這可能是因爲你從本地主機訪問它?你看到的IP是127.0.0.1,還是你的本地IP(192.168.x.x)?

2

當你的網絡服務器在本地機器上時,它會給你本地IP地址127.0.0.1,這是因爲你沒有從外部訪問它。這是理由。

+0

但我的網絡服務器不在我的本地機器上。來自whatsmyip站點的「正確的」IP地址是213.115.255.236,我從我自己迴應的IP地址是194.192.151.254 – Weblurk 2011-05-23 13:43:03

+0

然後可能是在您的局域網中...... – 2011-05-23 13:50:08

1

什麼是IP?

我唯一能做的就是,你可能會背後的代理。它會是嗎?

+0

「正確「來自whatsmyip站點的IP是213.115.255.236,而我從我自己迴應的IP是194.192.151.254 – Weblurk 2011-05-23 13:42:32

3

首先讓我澄清幾件事。

當你在本地主機上你不使用你的ISP要獲取一個網頁,因此你會使用內部ip 127.0.0.1::1爲ipv6。

如果你通過某種類型的路由器從在本地網絡上抓取的網頁,你將不得不通過諸如192.168.1.90

如果您的網站外網主辦的路由器分配的IP,然後你問你的ISP爲您提取網站,這意味着您可以使用whatsmyip指定的IP。

如果您使用DNS服務器(如Opendns),那麼您要求您的ISP要求Opendns爲您提取網站,並且打開DNS使用一組與您的ip不同的ip,原因很明顯。

可能存在某種可能會干擾的代理,所以您應該做的就是對此進行反制,標準代理站點應將客戶端IP轉發到服務器,以防止需要進行任何直接連接以及其他幾個原因。

這是說,你通常可以找到通過檢查其他幾個PARAMS的IP您檢查REMOTE_ADDR之前,這裏是我爲我的項目之一創建一個類,但你可以把你需要的東西:

https://github.com/AdminSpot/ASDDL/blob/master/system/classes/http/request.php

foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key) 
{ 
    if (array_key_exists($key, $_SERVER) === true) 
    { 
     foreach (explode(',', $_SERVER[$key]) as $ip) 
     { 
      if (filter_var($ip, FILTER_VALIDATE_IP) !== false) 
      { 
       $this->ip = $ip; 
       break; 
      } 
     } 
    } 
} 

正如你可以看到排列的順序是非常重要的:

  • HTTP_CLIENT_IP
  • HTTP_X_FORWARDED_FOR
  • HTTP_X_FORWARDED
  • HTTP_X_CLUSTER_CLIENT_IP
  • HTTP_FORWARDED_FOR
  • HTTP_FORWARDED
  • REMOTE_ADDR

通知REMOTE_ADDR說到最後,這是因爲這是最後的手段,大部分的時間是不正確。

+0

首先檢查REMOTE_ADDR是否是私人地址可能是合適的;其他值可能在標題中被欺騙。 http://stackoverflow.com/questions/13818064/check-if-an-ip-address-is-private – Mike 2013-05-22 13:36:16

1

如果你的服務器是Apache和使用Apache之前一些前端,你可以嘗試使用mod_rpaf
在Debian中:
aptitude install libapache2-mod-rpaf
然後編輯配置:
nano /etc/apache2/mods-enabled/rpaf.conf

<IfModule mod_rpaf.c> 
RPAFenable On 
RPAFsethostname Off 
RPAFproxy_ips 127.0.0.1 
</IfModule> 
相關問題