2014-03-26 23 views
2

我想阻止某些特定國家的用戶,並發現ipinfo.io可用於此目的。但是當我嘗試在Node.js和Express應用程序中使用它時,它看起來沒有返回正確的結果。如何在Node.js和Express(和Heroku)應用程序中正確使用ipinfo.io

下面是我寫的代碼:


var request = require("request"); 

exports.index = function(req, res) { 
    request.get("http://ipinfo.io/" + req.ip + "/json", function(err, response, body) { 
     res.write(body); 
     res.end() 
    }); 
} 

exports.index2 = function(req, res) { 
    request.get("http://ipinfo.io/json", function(err, response, body) { 
     res.write(body); 
     res.end(); 
    }); 
} 

我conencted上述每個特定的路線,比如,http://myapp/index1http://myapp/index2這兩個功能。然而,當我試圖訪問http://myapp/index1,結果是一樣的東西如下:

{ 
    "ip": "10.xxx.xx.xx", # BTW, is this ip secure information? 
    "hostname": "No Hostname", 
    "loc": "", 
    "bogon": true 
} 

所以它不會返回正確的值。

當我試圖訪問http://myapp/index2時,結果是AWS上的IP,因爲Heroku在其後臺使用AWS。

那麼如何才能讓它返回正確的結果呢?

回答

2

https://devcenter.heroku.com/articles/http-routing說:

「X - 轉發適用於:客戶端連接到Heroku的路由器的原始IP地址」

所以使用:

req.headers['x-forwarded-for'] 

,而不是

req.ip 

如果您使用req.ip,則「詢問」ipinfo.io關於路由器的IP。

+0

感謝您的澄清。雖然位置不準確,但現在我已經得到了正確的值。 – Blaszard

2

它看起來像你在一個代理的背後,你傳遞一個內部IP地址給ipinfo.io。你應該啓用「信任代理」設置,以便快遞從X-Forwarded-For頭拉正確的IP,如:

app.enable('trust proxy')

然後你就可以使用req.ip將正確返回客戶端的IP。您可能不應直接使用req.headers['x-forwarded-for'],因爲它可能包含IP列表。

更多詳細信息請見http://expressjs.com/guide.html#proxies

相關問題