Obtener el subdominio de una URL parece fácil al principio.
http://www.domain.example
Escanee el primer período y luego devuelva lo que vino después de "http: //" ...
Entonces te acuerdas
http://super.duper.domain.example
Oh. Entonces piensas, está bien, encuentra el último punto, retrocede una palabra y obtén todo antes.
Entonces te acuerdas
http://super.duper.domain.co.uk
Y has vuelto al punto de partida. ¿Alguien tiene alguna gran idea además de almacenar una lista de todos los TLD?
Respuestas:
No, porque cada TLD difiere en lo que cuenta como subdominio, dominio de segundo nivel, etc.
Tenga en cuenta que existen dominios de nivel superior, dominios de segundo nivel y subdominios. Técnicamente hablando, todo excepto el TLD es un subdominio.
En el ejemplo de domain.com.uk, "dominio" es un subdominio, "com" es un dominio de segundo nivel y "uk" es el TLD.
Por tanto, la cuestión sigue siendo más compleja que a primera vista y depende de cómo se gestione cada TLD. Necesitará una base de datos de todos los TLD que incluyen su partición particular y lo que cuenta como dominio de segundo nivel y subdominio. Sin embargo, no hay demasiados TLD, por lo que la lista es razonablemente manejable, pero recopilar toda esa información no es trivial. Es posible que ya exista una lista de este tipo.
Parece que http://publicsuffix.org/ es una de esas listas: todos los sufijos comunes (.com, .co.uk, etc.) en una lista adecuada para la búsqueda. Aún no será fácil analizarlo, pero al menos no tiene que mantener la lista.
Mirando la lista , puede ver que no es un problema trivial. Creo que una lista es la única forma correcta de lograr esto ...
fuente
Como dice Adam, no es fácil y actualmente la única forma práctica es utilizar una lista.
Incluso entonces hay excepciones, por ejemplo,
.uk
hay un puñado de dominios que son válidos inmediatamente en ese nivel que no están.co.uk
incluidos, por lo que deben agregarse como excepciones.Actualmente, así es como lo hacen los navegadores convencionales: es necesario asegurarse de que
example.co.uk
no se pueda establecer una cookie para la.co.uk
que luego se enviaría a cualquier otro sitio web.co.uk
.La buena noticia es que ya hay una lista disponible en http://publicsuffix.org/ .
También hay algo de trabajo en el IETF para crear algún tipo de estándar que permita a los TLD declarar cómo se ve su estructura de dominio. Sin embargo, esto es un poco complicado para los gustos de
.uk.com
, que se opera como si fuera un sufijo público, pero el.com
registro no lo vende .fuente
.uk
registro de dominio ahora permite los registros directamente en el segundo nivel. Esto se refleja en consecuencia en el PSL.Publicsuffix.org parece la forma de hacerlo. Existen muchas implementaciones para analizar fácilmente el contenido del archivo de datos publicsuffix:
fuente
Como ya dijeron Adam y John, publicsuffix.org es el camino correcto a seguir. Pero, si por alguna razón no puede usar este enfoque, aquí hay una heurística basada en una suposición que funciona para el 99% de todos los dominios:
Hay una propiedad que distingue (no todos, pero casi todos) los dominios "reales" de los subdominios y TLD y ese es el registro MX del DNS. Puede crear un algoritmo que busque esto: elimine las partes del nombre de host una por una y consulte el DNS hasta que encuentre un registro MX. Ejemplo:
Aquí hay un ejemplo en php:
fuente
.ai
o.ax
solo para nombrar algunos).Como ya se dijo, Public Suffix List es solo una forma de analizar el dominio correctamente. Para PHP, puede probar TLDExtract . Aquí hay un código de muestra:
fuente
Acabo de escribir un programa para esto en clojure basado en la información de publicsuffix.org:
https://github.com/isaksky/url_dom
Por ejemplo:
fuente
Para una biblioteca C (con generación de tablas de datos en Python), escribí http://code.google.com/p/domain-registry-provider/ que es rápido y eficiente en el espacio.
La biblioteca usa ~ 30kB para las tablas de datos y ~ 10kB para el código C. No hay sobrecarga de inicio ya que las tablas se construyen en tiempo de compilación. Consulte http://code.google.com/p/domain-registry-provider/wiki/DesignDoc para obtener más detalles.
Para comprender mejor el código de generación de tablas (Python), comience aquí: http://code.google.com/p/domain-registry-provider/source/browse/trunk/src/registry_tables_generator/registry_tables_generator.py
Para comprender mejor la API de C, consulte: http://code.google.com/p/domain-registry-provider/source/browse/trunk/src/domain_registry/domain_registry.h
fuente
No lo está resolviendo exactamente, pero tal vez pueda obtener una respuesta útil si intenta buscar el dominio pieza por pieza y verifica la respuesta, es decir, busque ' http: // uk ', luego ' http://co.uk ' , luego ' http://domain.co.uk '. Cuando obtiene una respuesta sin error, tiene el dominio y el resto es subdominio.
A veces solo tienes que probarlo :)
Editar:
Tom Leys señala en los comentarios que algunos dominios están configurados solo en el subdominio www, lo que nos daría una respuesta incorrecta en la prueba anterior. ¡Buen punto! ¿Quizás el mejor enfoque sería verificar cada parte con ' http: // www ' así como con 'http: //', y contar una visita como una visita para esa sección del nombre de dominio? Todavía nos faltarían algunos arreglos 'alternativos' como 'web.domain.com', pero no me he encontrado con uno de esos por un tiempo :)
fuente
.DK
y algunos otros, ya quehttp://dk/
funciona como está. Este tipo de heurísticas no son el camino a seguir ...Utilice URIBuilder y luego obtenga el atributo URIBUilder.host dividirlo en una matriz en "." ahora tiene una matriz con el dominio dividido.
fuente
fuente
Acabo de escribir una biblioteca objc: https://github.com/kejinlu/KKDomain
fuente
Puede usar esta lib tld.js: API de JavaScript para trabajar con nombres de dominio, subdominios y URI complejos.
Si obtiene el dominio raíz en el navegador. Puede utilizar esta lib AngusFu / browser-root-domain .
Usar cookies es complicado.
fuente
Si está buscando extraer subdominios y / o dominios de una lista arbitraria de URL, este script de Python puede ser útil. Pero ten cuidado, no es perfecto. Este es un problema complicado de resolver en general y es muy útil si tiene una lista blanca de dominios que está esperando.
fuente
Lista de sufijos comunes (.co.uk, .com, etcétera) para eliminar junto con http: // y luego solo tendrá "subdominio" para trabajar en lugar de " http: // sub. domain.suffix ", o al menos eso es lo que probablemente haría.
El mayor problema es la lista de posibles sufijos. Después de todo, hay mucho.
fuente
Después de echar un vistazo rápido a la lista publicsuffix.org, parece que podría hacer una aproximación razonable eliminando los tres segmentos finales ("segmento" aquí significa una sección entre dos puntos) de los dominios donde el segmento final tiene dos caracteres de longitud, en el supuesto de que se trata de un código de país y se subdividirá más. Si el segmento final es "nosotros" y el penúltimo segmento también tiene dos caracteres, elimine los últimos cuatro segmentos. En todos los demás casos, elimine los dos últimos segmentos. p.ej:
"ejemplo" no tiene dos caracteres, así que elimine "dominio.example", dejando "www"
"ejemplo" no tiene dos caracteres, así que elimine "dominio.example", dejando "super.duper"
"reino unido" tiene dos caracteres (pero no "nosotros"), así que elimine "dominio.co.uk" y deje "super.duper"
"nosotros" son dos caracteres y es "nosotros", más "wy" también son dos caracteres, así que elimine "pvt.k12.wy.us", dejando "foo".
Tenga en cuenta que, aunque esto funciona para todos los ejemplos que he visto en las respuestas hasta ahora, sigue siendo solo una aproximación razonable. No es del todo correcto, aunque sospecho que es lo más parecido posible sin hacer / obtener una lista real para usar como referencia.
fuente
.NAME
por ejemplo, cuando solo se podían comprarfirstname.lastname.name
nombres de dominio. Y en la dirección opuesta, ahora.US
también es plana, por lo que puedex.y.z.whatever.us
comprar solowhatever.us
en el registro y luego su algoritmo fallará.