2010-10-08 105 views
36

我有Rails 2.3.8,Ruby 1.8.7,Mongrel Web Server和MySQL數據庫。獲取本地Rails開發環境中的真實IP地址

我在發展模式,我需要找到真正的IP地址

當我使用request.remote_ip我收到IP爲127.0.0.1

我知道我得到127.0.0.1因爲我我正在開發本地機器......但是有沒有辦法獲得真正的IP地址,即使我在本地機器上?

我在我的控制器中使用了下面提到的,我所得到的全部都是127.0.0.1,它們都在視圖中。

request.remote_ip 
request.env["HTTP_X_FORWARDED_FOR"] 
request.remote_addr 
request.env['REMOTE_ADDR'] 
+0

這是因爲你在本地機器上開發。如果此代碼位於服務器上,並且您從客戶端訪問該頁面,則將獲得*真實* IP地址。 – Mischa 2010-10-08 05:36:24

+0

嘗試去你的'真實'的地址上的服務器。所以不要去127.0.0.1,而是去你的'外部IP'。不要忘記運行服務器以偵聽該地址! – gavit 2015-12-05 12:09:27

回答

30

據我所見,沒有用於獲取本地計算機遠程地址的標準方法。如果您需要遠程地址(測試)您的地理編碼,我建議將127.0.0.1添加到您的數據庫表中,使IP地址與位置匹配。

作爲最後的手段,你也可以硬編碼你的遠程地址。例如。像這樣:

class ApplicationController < ActionController::Base 
    def remote_ip 
    if request.remote_ip == '127.0.0.1' 
     # Hard coded remote address 
     '123.45.67.89' 
    else 
     request.remote_ip 
    end 
    end 
end 

class MyController < ApplicationController 
    def index 
    @client_ip = remote_ip() 
    end 
end 
15

我不認爲你會得到你的'真正的IP'在本地主機,其原因實際上在於TCP/IP。

遠程IP地址取決於請求發送到的網絡。由於它是通信時發送IP地址的TCP/IP的一部分,因此它總是轉換爲目標計算機可能理解的相對IP地址。當請求位於您的子網內時,它是您的本地IP。一旦它通過服務提供商進入網絡,它就會假設一個全球IP,並可以追蹤到服務提供商(注意:這是有爭議的,取決於您的網絡設置)。

所以,如果你在本地測試,那麼它會是你所經歷的127.0.0.1。如果您通過本地網絡發送它,它將成爲您網絡中的IP。例如,我的辦公室網絡中的計算機IP爲192.168.1.7,如果我通過同一網絡中的另一臺計算機(例如從192.168.1.13)訪問3000端口的應用程序,那麼我將request.remote_ip設爲192.168.1.13

這是什麼意思是,當你在本地主機上,127.0.0.1 你的真實IP。同樣在我提到的例子中,192.168.1.13是發送請求的機器的真實IP。

+0

那麼有沒有辦法獲得發送請求的機器的IP地址?在你的例子中是:192.168.1.13 – ben 2015-01-05 16:07:17

5

取決於您如何訪問網址。

如果您使用http://127.0.0.1/....http://localhost/....訪問網址,您將獲得127.0.0.1作爲遠程IP。如果您在LAN上,請使用http:// {lan-ip}/....

例如, http://172.20.25.210/.......

1

如果您使用真實IP訪問開發機器,您應該獲得真實IP,因此不要使用localhost,而是使用您的真實IP。並不是所有的路由器都允許局域網訪問一臺機器到一個外部IP地址,而這個IP地址實際上是在這個局域網上,但大部分路由器都可以。

+0

在這種情況下,你必須確保服務器監聽特定的接口。我嘗試過這一次,服務器只監聽回送接口(127.0.0.1),所以我的Rails應用程序從未收到請求。聆聽'0.0.0.0'而不是訣竅。 – 2012-10-01 11:11:32

1

我與Rspec的測試和我所做的是:

request.stub(:remote_ip).and_return('198.172.43.34') 
Instance.stub(:find_by_key).and_return(@instance) 
before = @instance.weekly_statistic.times_opened_by['198.172.43.34'] 

get :key, :key=>"314C00" 

@instance.weekly_statistic.times_opened_by['198.172.43.34'].should == before+1 

和它的工作就像一個魅力! :)

1

問題:

我們試圖做的最近的一個項目類似的事情,在我們的代碼中使用request.remote_ip都遇到了問題。它不斷返回127.0.0.1::1。當與Geocoder gem結合使用時,它給了我們一個空陣列並且基本上是無用的。

解決方案:

有在telize.com一個非常好的API返回的任何撞擊它的IP地址。我們實現的代碼看起來是這樣的:

這不是最導軌-Y方式做到這一點,但我覺得這是一個不錯的解決方案,因爲它會在本地和生產正常工作。唯一的潛在問題是如果你達到他們的API限制,但對於小型項目來說,這應該不是問題。

6

這就是我通常做時下:

if Rails.env.production? 
    request.remote_ip 
else 
    Net::HTTP.get(URI.parse('http://checkip.amazonaws.com/')).squish 
end 
+0

這將返回您的開發機器的真實IP – BSB 2017-02-09 17:06:32

+0

你知道嗎,它有每日限制嗎? – 7urkm3n 2018-01-15 00:51:34