2013-12-20 1 views
1

Я пытаюсь получить клиентский ip в Rails 3. Приложение установлено в облачном хостинге с SSL и сервером nginx.Не удается получить удаленный ip в Rails 3

Я написал код, чтобы получить клиентский ip.

request.remote_ip 
request.env['HTTP_X_FORWARDED_FOR'] 

Но он возвращает неправильный адрес, как '10 .159.21.86' Есть ли какие-либо проблемы, связанные с сервера Nginx, или установки SSL?

+0

Этот IP-адрес такой же, как и для ip-устройства, на котором установлено приложение. –

+0

, вероятно, ваш трафик проходит через nginx/лак/stunnel/etc, а исходные адреса изменены. Обратитесь к своему провайдеру облака, чтобы узнать, как вы можете получить реальный IP-адрес пользователя. – bcd

+0

Я помню, что получал аналогичную проблему. Вы можете попробовать установить модуль nginx real_ip. Проверьте, помогает ли это. –

ответ

0
def remote_ip 
    @remote_ip ||= (@env["action_dispatch.remote_ip"] || ip).to_s 
end 

request.remote_ip получает IP-адрес клиента за пределами локальной прокси, но если ваш запрос исходит от машины разработки и машина развития, где ваш сервер, вероятно, вы получите 127.0.0.1 или неправильный IP Но если запрос поступает с другого компьютера, это будет IP-адрес удаленной машины. Однако при различных условиях это может быть не реальный IP-адрес машины (машина за прокси-сервером, использующая tor или другой инструмент, чтобы скрыть его e.t.c.). так что вы можете также попробовать: -

request.env['REMOTE_ADDR'] 

Вы должны visit этот пост написан рельсах вкладчиком, описывающего Повторяющиеся заголовки и веб-серверов на Ruby

0

Я считаю, что проблема у вас есть то же самое описано в следующем Engine Запрос на поддержку двора: HAProxy, SSL Requests & Request IP Addresses.

По-видимому, есть обходное решение, но вы должны связаться с ним напрямую, чтобы узнать, что это такое.

Команда документов работает над официальной документацией, на короткий срок, пожалуйста, откройте билет, и инженер поддержки может помочь.

0

Если вы используете SSL с HAProxy (настройка по умолчанию для сред с несколькими экземплярами), то он не сможет вытащить удаленный IP из-за передачи с HAProxy на Nginx. У нас есть решение, которое использует stunnel, чтобы обойти это, но поскольку все дешифрование SSL выполняется на экземпляре App Master, если у вас более пяти экземпляров, производительность будет страдать.

Другой вариант - использовать балансировку эластичной нагрузки вместо HAProxy. Документация для этого - https://support.cloud.engineyard.com/entries/21715452-Use-Elastic-Load-Balancing-with-Engine-Yard-Cloud.

Эван

Смежные вопросы