Obter o subdomínio de um URL parece fácil no início.
http://www.domain.example
Procure o primeiro período e, em seguida, retorne o que veio depois de "http: //" ...
Então você lembra
http://super.duper.domain.example
Oh. Então você pensa, ok, encontre o último período, volte uma palavra e pegue tudo antes!
Então você lembra
http://super.duper.domain.co.uk
E você está de volta à estaca zero. Alguém tem grandes ideias além de armazenar uma lista de todos os TLDs?
Respostas:
Não, porque cada TLD difere no que conta como subdomínio, domínio de segundo nível, etc.
Lembre-se de que existem domínios de nível superior, domínios de segundo nível e subdomínios. Tecnicamente falando, tudo, exceto o TLD, é um subdomínio.
No exemplo domain.com.uk, "domínio" é um subdomínio, "com" é um domínio de segundo nível e "uk" é o TLD.
Portanto, a questão continua mais complexa do que à primeira vista e depende de como cada TLD é gerenciado. Você precisará de um banco de dados de todos os TLDs que incluem seu particionamento específico e o que conta como um domínio de segundo nível e um subdomínio. Não há muitos TLDs, entretanto, a lista é razoavelmente gerenciável, mas coletar todas essas informações não é trivial. Pode já haver essa lista disponível.
Parece que http://publicsuffix.org/ é uma dessas listas — todos os sufixos comuns (.com, .co.uk, etc) em uma lista adequada para pesquisa. Ainda não será fácil analisá-lo, mas pelo menos você não precisa manter a lista.
Olhando a lista , você pode ver que não é um problema trivial. Acho que uma lista é a única maneira correta de fazer isso ...
fonte
Como diz Adam, não é fácil e, atualmente, a única forma prática é usar uma lista.
Mesmo assim, há exceções - por exemplo, em
.uk
há um punhado de domínios que são válidos imediatamente naquele nível que não estão.co.uk
, portanto, eles devem ser adicionados como exceções.Atualmente é assim que os navegadores convencionais fazem isso - é necessário garantir que
example.co.uk
não seja possível definir um cookie para o.co.uk
qual seria enviado para qualquer outro site em.co.uk
.A boa notícia é que já existe uma lista disponível em http://publicsuffix.org/ .
A IETF também está trabalhando para criar algum tipo de padrão para permitir que os TLDs declarem sua estrutura de domínio. No entanto, isso é um pouco complicado por nomes como
.uk.com
, que é operado como se fosse um sufixo público, mas não é vendido pelo.com
registro.fonte
.uk
registro de domínio agora permite registros diretamente no segundo nível. Isso é refletido em conformidade no PSL.Publicsuffix.org parece a maneira de fazer. Existem muitas implementações por aí para analisar o conteúdo do arquivo de dados publicsuffix facilmente:
fonte
Como já foi dito por Adam e John publicsuffix.org é o caminho correto a seguir. Mas, se por algum motivo você não puder usar essa abordagem, aqui está uma heurística baseada em uma suposição que funciona para 99% de todos os domínios:
Há uma propriedade que distingue (não todos, mas quase todos) domínios "reais" de subdomínios e TLDs: o registro MX do DNS. Você pode criar um algoritmo que procure por isso: Remova as partes do nome do host, uma a uma, e consulte o DNS até encontrar um registro MX. Exemplo:
Aqui está um exemplo em php:
fonte
.ai
ou.ax
para citar apenas alguns).Como já foi dito, a Lista Pública de Sufixos é apenas uma maneira de analisar o domínio corretamente. Para PHP, você pode tentar TLDExtract . Aqui está o código de amostra:
fonte
Acabei de escrever um programa para isso em clojure baseado nas informações de publicsuffix.org:
https://github.com/isaksky/url_dom
Por exemplo:
fonte
Para uma biblioteca C (com geração de tabela de dados em Python), escrevi http://code.google.com/p/domain-registry-provider/ que é rápido e economiza espaço.
A biblioteca usa ~ 30kB para as tabelas de dados e ~ 10kB para o código C. Não há sobrecarga de inicialização, pois as tabelas são construídas em tempo de compilação. Consulte http://code.google.com/p/domain-registry-provider/wiki/DesignDoc para obter mais detalhes.
Para entender melhor o código de geração de tabela (Python), comece aqui: http://code.google.com/p/domain-registry-provider/source/browse/trunk/src/registry_tables_generator/registry_tables_generator.py
Para entender melhor a API C, consulte: http://code.google.com/p/domain-registry-provider/source/browse/trunk/src/domain_registry/domain_registry.h
fonte
Não está funcionando exatamente, mas talvez você possa obter uma resposta útil tentando buscar o domínio peça por peça e verificando a resposta, ou seja, buscar ' http: // uk ' e, em seguida, ' http://co.uk ' e, em seguida, ' http://domain.co.uk '. Quando você obtém uma resposta sem erro, você tem o domínio e o resto é o subdomínio.
Às vezes você só tem que tentar :)
Editar:
Tom Leys aponta nos comentários, que alguns domínios são configurados apenas no subdomínio www, o que nos daria uma resposta incorreta no teste acima. Bom ponto! Talvez a melhor abordagem seja verificar cada parte com ' http: // www ' e também com 'http: //', e contar um acerto para qualquer um como um acerto para essa seção do nome de domínio. Ainda estaríamos perdendo alguns arranjos 'alternativos', como 'web.domain.com', mas eu não encontrei um deles por um tempo :)
fonte
.DK
e alguns outros, comohttp://dk/
funciona como está. Este tipo de heurística não é o caminho a seguir ...Use o URIBuilder e depois divida o atributo URIBUilder.host em um array em "." agora você tem uma matriz com o domínio dividido.
fonte
fonte
Acabei de escrever uma biblioteca objc: https://github.com/kejinlu/KKDomain
fonte
Você pode usar esta lib tld.js: API JavaScript para trabalhar com nomes de domínio complexos, subdomínios e URIs.
Se você está obtendo domínio raiz no navegador. Você pode usar este lib AngusFu / browser-root-domain .
Usar cookies é complicado.
fonte
Se você deseja extrair subdomínios e / ou domínios de uma lista arbitrária de URLs, este script python pode ser útil. Porém, tenha cuidado, não é perfeito. Este é um problema complicado de resolver em geral e é muito útil se você tiver uma lista de permissões de domínios que está esperando.
fonte
Lista de sufixos comuns (.co.uk, .com etc.) para remover junto com http: // e você terá apenas "sub.domain" para trabalhar em vez de " http: // sub. domain.suffix ", ou pelo menos é o que eu provavelmente faria.
O maior problema é a lista de sufixos possíveis. Afinal, há muito.
fonte
Tendo dado uma rápida olhada na lista publicsuffix.org, parece que você poderia fazer uma aproximação razoável removendo os três segmentos finais ("segmento" aqui significa uma seção entre dois pontos) de domínios onde o segmento final tem dois caracteres, assumindo que é um código de país e será subdividido posteriormente. Se o segmento final for "nós" e o penúltimo segmento também tiver dois caracteres, remova os quatro últimos segmentos. Em todos os outros casos, remova os dois segmentos finais. por exemplo:
"exemplo" não tem dois caracteres, então remova "domínio.exemplo", deixando "www"
"exemplo" não tem dois caracteres, então remova "domínio.exemplo", deixando "super.duper"
"uk" tem dois caracteres (mas não "nós"), então remova "domain.co.uk", deixando "super.duper"
"us" tem dois caracteres e é "us", mais "wy" também tem dois caracteres, então remova "pvt.k12.wy.us", deixando "foo".
Observe que, embora isso funcione para todos os exemplos que vi nas respostas até agora, permanece apenas uma aproximação razoável. Não é totalmente correto, embora eu suspeite que seja o mais próximo que você provavelmente chegará sem fazer / obter uma lista real para usar como referência.
fonte
.NAME
por exemplo, quando você podia comprar apenasfirstname.lastname.name
nomes de domínio. E na direção oposta, agora.US
também é plano, então você podex.y.z.whatever.us
comprá-lo apenaswhatever.us
no registro e seu algoritmo falhará nele.