Получение имени хоста или IP в Ruby on Rails

Global.asax

protected void Application_BeginRequest()
{
if (!Context.Request.Url.AbsoluteUri.Contains("localhost") && !Context.Request.IsSecureConnection)
Response.Redirect(Context.Request.Url.ToString().Replace("http:", "https:"));
}
77
задан True Soft 26 February 2011 в 15:43
поделиться

7 ответов

От coderrr.wordpress.com :

require 'socket'

def local_ip
  orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true  # turn off reverse DNS resolution temporarily

  UDPSocket.open do |s|
    s.connect '64.233.187.99', 1
    s.addr.last
  end
ensure
  Socket.do_not_reverse_lookup = orig
end

# irb:0> local_ip
# => "192.168.0.127"
47
ответ дан titanous 24 November 2019 в 10:46
поделиться

Попробуйте это:

host = `hostname`.strip # Get the hostname from the shell and removing trailing \n
puts host               # Output the hostname
24
ответ дан Peter 24 November 2019 в 10:46
поделиться

Вы будете, вероятно, иметь несколько IP-адресов на каждой машине (127.0.0.1, 192.168.0.1, и т.д.). Если бы Вы используете *, ОТКЛОНЯЮТ как Ваша ОС, я предложил бы использовать hostname, и затем увеличить взгляд DNS на этом. Необходимо быть в состоянии использовать/etc/hosts для определения локального имени узла для разрешения к IP-адресу для той машины. В Windows существует схожая функциональность, но я не использовал его, так как Windows 95 был новейшим.

другая опция состояла бы в том, чтобы поразить сервис поиска как WhatIsMyIp.com . Эти парни ответят Вашему реальному IP-адресу ударом на удар Вам. Это - также что-то, что можно легко установить со сценарием Perl на локальном сервере, если Вы предпочитаете. Я полагаю, что приблизительно 3 строки кода для вывода удаленного IP от %ENV должны покрыть Вас.

1
ответ дан Jack M. 24 November 2019 в 10:46
поделиться

попытка: Запрос remote_ip

remote_ip ()

Определяют инициирующий IP-адрес. REMOTE_ADDR является стандартом, но перестанет работать, если пользователь находится позади прокси. HTTP_CLIENT_IP и/или HTTP_X_FORWARDED_FOR установлены прокси так проверка на них, если REMOTE_ADDR является прокси. HTTP_X_FORWARDED_FOR может быть запятой - разграниченный список в случае нескольких цепочечных прокси; последний адрес, которому не доверяют, является инициирующим IP.

Обновление: ой, извините, я неправильно читал документацию.

0
ответ дан Adrian Mann 24 November 2019 в 10:46
поделиться

Имя хоста

Простой способ просто получить имя хоста в Ruby:

require 'socket'
hostname = Socket.gethostname

Загвоздка в том, что это зависит от того, что хост знает свое собственное имя, потому что он использует системный вызов gethostname или uname , поэтому он не будет работать для исходная проблема.

Функционально это идентично ответу hostname , без вызова внешней программы. Имя хоста может быть или не быть полным, в зависимости от конфигурации машины.


IP-адрес

Начиная с Ruby 1.9, вы также можете использовать библиотеку Socket для получения списка локальных адресов. ip_address_list возвращает массив объектов AddrInfo . То, как вы его выберете, будет зависеть от того, что вы хотите сделать и сколько интерфейсов у вас есть, но вот пример, который просто выбирает первый IP-адрес IPV4 без обратной связи в виде строки:

require 'socket'
ip_address = Socket.ip_address_list.find { |ai| ai.ipv4? && !ai.ipv4_loopback? }.ip_address
134
ответ дан 24 November 2019 в 10:46
поделиться

Поместите выделенную часть в обратные кавычки:

`dig #{request.host} +short`.strip # dig gives a newline at the end

Или просто request.host , если вам все равно, IP это или нет.

2
ответ дан 24 November 2019 в 10:46
поделиться

Самое простое - host_with_port в controller.rb

host_port= request.host_with_port
7
ответ дан 24 November 2019 в 10:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: