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:"));
}
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"
Попробуйте это:
host = `hostname`.strip # Get the hostname from the shell and removing trailing \n
puts host # Output the hostname
Вы будете, вероятно, иметь несколько IP-адресов на каждой машине (127.0.0.1, 192.168.0.1, и т.д.). Если бы Вы используете *, ОТКЛОНЯЮТ как Ваша ОС, я предложил бы использовать hostname
, и затем увеличить взгляд DNS на этом. Необходимо быть в состоянии использовать/etc/hosts для определения локального имени узла для разрешения к IP-адресу для той машины. В Windows существует схожая функциональность, но я не использовал его, так как Windows 95 был новейшим.
другая опция состояла бы в том, чтобы поразить сервис поиска как WhatIsMyIp.com . Эти парни ответят Вашему реальному IP-адресу ударом на удар Вам. Это - также что-то, что можно легко установить со сценарием Perl на локальном сервере, если Вы предпочитаете. Я полагаю, что приблизительно 3 строки кода для вывода удаленного IP от %ENV должны покрыть Вас.
попытка: Запрос remote_ip
remote_ip ()
Определяют инициирующий IP-адрес. REMOTE_ADDR является стандартом, но перестанет работать, если пользователь находится позади прокси. HTTP_CLIENT_IP и/или HTTP_X_FORWARDED_FOR установлены прокси так проверка на них, если REMOTE_ADDR является прокси. HTTP_X_FORWARDED_FOR может быть запятой - разграниченный список в случае нескольких цепочечных прокси; последний адрес, которому не доверяют, является инициирующим IP.
Обновление: ой, извините, я неправильно читал документацию.
Имя хоста
Простой способ просто получить имя хоста в 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
Поместите выделенную часть в обратные кавычки:
`dig #{request.host} +short`.strip # dig gives a newline at the end
Или просто request.host
, если вам все равно, IP это или нет.
Самое простое - host_with_port
в controller.rb
host_port= request.host_with_port