【问题标题】:Heroku Geolocation >> Always Returns "Seattle, WA"Heroku Geolocation >> 总是返回“西雅图,华盛顿”
【发布时间】: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

标签: ruby-on-rails heroku geolocation ip


【解决方案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。
    猜你喜欢
    • 2011-09-10
    • 2015-11-23
    • 2018-10-11
    • 2014-07-07
    • 1970-01-01
    • 2020-05-29
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多