Heroku Geolocation >> Всегда возвращает "Сиэтл, Вашингтон" - PullRequest
2 голосов
/ 30 марта 2011

В Rails 3 и geo_ip, и geo_location возвращают точные результаты на моем локальном компьютере, но после загрузки в Heroku постоянно возвращают "Сиэтл, Вашингтон" (я нахожусь в Пенсильвании).

Я немного покопался и обнаружил, что общая база данных Heroku, которую я использую, находится в Сиэтле. Кто-нибудь может указать мне правильное направление, как справиться с этой ситуацией? Опять же, при локальном запуске геолокация работает как положено.

Спасибо !!

Ответы [ 3 ]

2 голосов
/ 31 марта 2011

Я не знаю, как работает 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 добавьте эти строки, где регулярное выражение allow_ips включает ваши IP-адреса балансировщика нагрузки. Замените a.b.c. IP-адресами балансировщика нагрузки, которые вы получаете от heroku.

# 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)
2 голосов
/ 31 марта 2011

Если вы используете SSL на основе имени хоста в Heroku, в настоящее время невозможно получить исходный 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"}

Мой планэто сделать Ajax-запрос к jsonip, затем передать 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"]

(Кажется, с геокитом будет легче иметь дело, потому что он не требует, чтобы я управлял файлом .dat сопоставлений IP. Я ожидаю, что в конечном итоге буду использоватьчто.)

0 голосов
/ 30 марта 2011

Интересно.Будучи нубом Rails, я могу только спросить, откуда он получает IP?Есть ли способ убедиться, что он получает его от пользователя?(Закончите rails noob, так что вы, возможно, уже делаете это, а я просто не знаю)

Я также нашел плагин, который, кажется, хорошо сделан, называется GeoKit.Ссылка: http://geokit.rubyforge.org/ - Может, лучше будет работать?

...