Heroku Geolocation >> 总是返回“西雅图,华盛顿”

Posted

技术标签:

【中文标题】Heroku Geolocation >> 总是返回“西雅图,华盛顿”【英文标题】:Heroku Geolocation >> Always Returns "Seattle, WA" 【发布时间】:2011-03-29 23:14:09 【问题描述】:

在 Rails 3 中,geo_ip 和 geo_location gem 在我的本地机器上返回准确的结果,但一旦上传到 Heroku,就会持续返回“西雅图,华盛顿”(我位于宾夕法尼亚州)。

我做了一些挖掘,发现我使用的 Heroku 共享数据库位于西雅图。谁能指出我如何处理这种情况的正确方向?同样,在本地运行时,地理位置正在按预期工作。

谢谢!!

【问题讨论】:

我没有遇到过您遇到的问题(在 heroku 上,总是看到一个西雅图 request.remote_ip)...您如何将 request.remote_ip 地理编码到物理位置? 感谢您的回复 - 抱歉,我一直在更新/删除我的回复评论,让我为您获取准确的代码。 这可能是亚马逊的事情。 Heroku 和 Engine Yard 都在 Amazon AWS 上运行。 EngineYard has a similar problem 【参考方案1】:

如果您在 Heroku 上使用基于主机名的 SSL,则目前无法获取请求的原始 IP。看到这个帖子:

http://groups.google.com/group/heroku/browse_thread/thread/8cd2cba55f9aeb19

在那个帖子上,有人提到了http://jsonip.com/,这符合您的预期:

ultramarine:~ jdc$ curl http://jsonip.com/
"ip":"131.247.152.2"

我的计划是向 jsonip 发出 Ajax 请求,然后将 IP 传回服务器并使用 geoip 或 geokit 对其进行地理定位。因此,我用 geoip 进行了尝试:

ruby-1.9.2-p136 :004 > c = GeoIP.new('GeoIP.dat').country('131.247.152.2')
 => ["131.247.152.2", "131.247.152.2", 225, "US", "USA", "United States", "NA"]

(看起来 geokit 会更容易处理,因为它不需要我管理 IP 映射的 .dat 文件。我希望最终会使用它。)

【讨论】:

顺便说一句,我刚刚尝试使用 SimpleGeo API 来执行此操作,而且非常棒。我提交了两个补丁和一个拉取请求,但与此同时,您可以看到我将如何使用它here (GitHub)。【参考方案2】:

我不知道 heroku 是如何工作的,但你可能在负载均衡器后面。您需要将TRUSTED_PROXIES 设置为将 request.remote_ip 设置为HTTP_X_FORWARDED_FOR 地址。

您可以通过向其中一个控制器添加操作来检查这是否是您的问题,如下所示:

def remote_ip
  render :text => "REMOTE_ADDR: %s<br/>remote_ip: %s<br/>HTTP_X_FORWARDED_FOR: %s" % 
                [ request.env['REMOTE_ADDR'],
                  request.remote_ip,
                  request.env['HTTP_X_FORWARDED_FOR'] ]
end

如果你有一个HTTP_X_FORWARDED_FOR,那么你需要告诉 Rails 可信代理。一旦你这样做了,你的request.remote_ip 和你的HTTP_X_FORWARDED_FOR ips 将是相同的。

在您的 production.rb 中,添加这些行,其中 allowed_ips 正则表达式包含您的负载平衡器 IP。将 a.b.c. 替换为您从 heroku 获得的负载均衡器 IP。

# Setup Trusted Proxies
allowed_ips = /^a\.b\.c\.|^127\.0\.0\.1$|^(10|172\.(1[6-9]|2[0-9]|30|31)|192\.168)\./i
ActionController::Request.const_set("TRUSTED_PROXIES", allowed_ips)

【讨论】:

【参考方案3】:

有趣。作为一个 Rails 菜鸟,我唯一能问的是它从哪里获得 IP?有没有办法确保它是从用户那里得到的? (完整的rails noob,所以你可能已经在这样做了,我只是不知道)

我还发现了一个看起来制作精良的插件,叫做 GeoKit。链接:http://geokit.rubyforge.org/ -- 也许会更好?

【讨论】:

我正在使用 request.remote_ip 来检索 IP 地址。我相信这是与 Heroku 上托管有关的问题,而不是我正在使用的 gem。

以上是关于Heroku Geolocation >> 总是返回“西雅图,华盛顿”的主要内容,如果未能解决你的问题,请参考以下文章

html CRM 2016 #G​​oogle #Geolocation #Webresource#CRM2016 #MoussaElAnnan

Heroku:您的帐户 example@email.com 无权访问 <app-name>

#yyds干活盘点# 4.1 HTML5 Geolocation(定理定位)

geolocation/ 百度地图api Geolocation 定位当前城市信息

Flutter:使用 geolocation 包的 getPermission 函数中的位置参数太多

Cordova geolocation.getCurrentPosition 在 iPad 上引发超时