У меня только что была эта проблема. В моем случае работал только тогда, когда я остановил эмулятор, закрыл его и снова открыл. Я не делал никаких других изменений.
Обнаружение поддомена URL-адреса в общем смысле нетривиально - это легко, если вы просто рассмотрите базовые, но как только вы попадете на международную территорию, это становится сложно.
Изменить : Подумайте такие вещи, как http://mylocalschool.k12.oh.us и др.
Примерно так:
def remove_subdomain(host)
# Not complete. Add all root domain to regexp
host.sub(/.*?([^.]+(\.com|\.co\.uk|\.uk|\.nl))$/, "\\1")
end
puts remove_subdomain("www.example.com") # -> example.com
puts remove_subdomain("www.company.co.uk") # -> company.co.uk
puts remove_subdomain("www.sub.domain.nl") # -> domain.nl
Вам все равно нужно добавить все (корневые) домены, которые вы считаете корневыми. Таким образом, '.uk' может быть корневым доменом, но вы, вероятно, захотите оставить хост непосредственно перед частью '.co.uk'.
Регулярное выражение, которое вам здесь понадобится, может быть немного сложным, потому что имена хостов могут быть бесконечно сложными - у вас может быть несколько поддоменов (например, foo.bar.baz.com), или домен верхнего уровня (TLD) может состоять из нескольких частей (например, www.baz.co.uk).
Готовы к сложному регулярному выражению? :)
re = /^(?:(?>[a-z0-9-]*\.)+?|)([a-z0-9-]+\.(?>[a-z]*(?>\.[a-z]{2})?))$/i
new_url = o_url.host.gsub(re, '\1').strip
Разобьем это на два раздела. ^ (?: (?> [A-z0-9 -] * \.) +? |)
будет собирать субдомены, сопоставляя одну или несколько групп символов, за которыми следует точка (жадно, чтобы здесь сопоставляются все поддомены). Пустое чередование необходимо в случае отсутствия поддомена (например, foo.com). ([a-z0-9 -] + \. (?> [Az] * (?> \. [Az] {2})?)) $
соберет фактическое имя хоста и TLD. Это позволяет использовать либо односоставный TLD (например, .info, .com или .museum),
Это непростой вопрос. Некоторые домены верхнего уровня не принимают регистрацию на втором уровне.
Сравните example.com
и example.co.uk
. Если вы просто удалите все, кроме двух последних доменов, вы получите example.com
и co.uk
, что никогда не может быть намерением.
Firefox решает эту проблему. это путем фильтрации по эффективному домену верхнего уровня , и они поддерживают список всех этих доменов . Дополнительная информация на publicsuffix.org .
Вы можете использовать этот список, чтобы отфильтровать все, кроме домена справа рядом с действующим TLD. Я не знаю ни одной библиотеки Ruby, которая бы это сделала, но было бы неплохо выпустить ее!
Обновление : есть C, Библиотеки Perl и PHP , которые это делают. Учитывая версию C, вы можете создать расширение Ruby. Как вариант, вы можете перенести код на Ruby.
Я только что написал для этого библиотеку под названием Domainatrix. Вы можете найти его здесь: http://github.com/pauldix/domainatrix
require 'rubygems'
require 'domainatrix'
url = Domainatrix.parse("http://www.pauldix.net")
url.public_suffix # => "net"
url.domain # => "pauldix"
url.canonical # => "net.pauldix"
url = Domainatrix.parse("http://foo.bar.pauldix.co.uk/asdf.html?q=arg")
url.public_suffix # => "co.uk"
url.domain # => "pauldix"
url.subdomain # => "foo.bar"
url.path # => "/asdf.html?q=arg"
url.canonical # => "uk.co.pauldix.bar.foo/asdf.html?q=arg"