Obtenir le sous-domaine à partir d'une URL semble facile au début.
http://www.domain.example
Scannez pour la première période puis retournez ce qui est venu après le "http: //" ...
Alors tu te souviens
http://super.duper.domain.example
Oh. Alors vous pensez, d'accord, trouvez la dernière période, revenez en arrière et récupérez tout avant!
Alors tu te souviens
http://super.duper.domain.co.uk
Et vous êtes de retour à la case départ. Quelqu'un a-t-il de bonnes idées en plus de stocker une liste de tous les TLD?
Réponses:
Non, car chaque TLD diffère sur ce qui compte comme un sous-domaine, un domaine de deuxième niveau, etc.
Gardez à l'esprit qu'il existe des domaines de premier niveau, des domaines de second niveau et des sous-domaines. Techniquement parlant, tout sauf le TLD est un sous-domaine.
Dans l'exemple domain.com.uk, "domain" est un sous-domaine, "com" est un domaine de second niveau et "uk" est le TLD.
La question reste donc plus complexe qu'à première vue, et cela dépend de la manière dont chaque TLD est géré. Vous aurez besoin d'une base de données de tous les TLD qui incluent leur partitionnement particulier, et ce qui compte comme un domaine de deuxième niveau et un sous-domaine. Cependant, il n'y a pas trop de TLD, donc la liste est raisonnablement gérable, mais la collecte de toutes ces informations n'est pas anodine. Une telle liste est peut-être déjà disponible.
On dirait que http://publicsuffix.org/ est une de ces listes - tous les suffixes courants (.com, .co.uk, etc.) dans une liste adaptée à la recherche. Il ne sera toujours pas facile de l'analyser, mais au moins vous n'avez pas à maintenir la liste.
En parcourant la liste , vous pouvez voir que ce n'est pas un problème trivial. Je pense qu'une liste est la seule façon correcte d'accomplir cela ...
la source
Comme Adam le dit, ce n'est pas facile, et actuellement le seul moyen pratique est d'utiliser une liste.
Même dans ce cas, il y a des exceptions - par exemple,
.uk
il y a une poignée de domaines qui sont valides immédiatement à ce niveau qui ne sont pas inclus.co.uk
, donc ceux-ci doivent être ajoutés comme exceptions.C'est actuellement ainsi que font les navigateurs traditionnels - il est nécessaire de s'assurer que
example.co.uk
vous ne pouvez pas définir un cookie pour.co.uk
lequel il serait ensuite envoyé à un autre site Web sous.co.uk
.La bonne nouvelle est qu'il existe déjà une liste disponible sur http://publicsuffix.org/ .
Il y a aussi du travail dans l' IETF pour créer une sorte de norme permettant aux TLD de déclarer à quoi ressemble la structure de leur domaine. Ceci est un peu compliqué par les goûts de
.uk.com
, qui fonctionne comme s'il s'agissait d'un suffixe public, mais n'est pas vendu par le.com
registre.la source
.uk
registre de domaine autorise désormais les enregistrements directement au deuxième niveau. Cela se reflète en conséquence dans le PSL.Publicsuffix.org semble la voie à suivre. Il existe de nombreuses implémentations pour analyser facilement le contenu du fichier de données publicuffix:
la source
Comme l'ont déjà dit Adam et John, publicuffix.org est la bonne voie à suivre. Mais, si pour une raison quelconque vous ne pouvez pas utiliser cette approche, voici une heuristique basée sur une hypothèse qui fonctionne pour 99% de tous les domaines:
Il y a une propriété qui distingue (pas tous, mais presque tous) les domaines «réels» des sous-domaines et des TLD et c'est l'enregistrement MX du DNS. Vous pouvez créer un algorithme qui recherche ceci: supprimez les parties du nom d'hôte une par une et interrogez le DNS jusqu'à ce que vous trouviez un enregistrement MX. Exemple:
Voici un exemple en php:
la source
.ai
ou.ax
pour n'en nommer que quelques-uns).Comme déjà dit, la liste des suffixes publics n'est qu'un moyen d'analyser correctement le domaine. Pour PHP, vous pouvez essayer TLDExtract . Voici un exemple de code:
la source
Je viens d'écrire un programme pour cela en clojure basé sur les informations de publicsuffix.org:
https://github.com/isaksky/url_dom
Par exemple:
la source
Pour une bibliothèque C (avec génération de table de données en Python), j'ai écrit http://code.google.com/p/domain-registry-provider/ qui est à la fois rapide et peu encombrant.
La bibliothèque utilise ~ 30 Ko pour les tables de données et ~ 10 Ko pour le code C. Il n'y a pas de surcharge de démarrage puisque les tables sont construites au moment de la compilation. Consultez http://code.google.com/p/domain-registry-provider/wiki/DesignDoc pour plus de détails.
Pour mieux comprendre le code de génération de table (Python), commencez ici: http://code.google.com/p/domain-registry-provider/source/browse/trunk/src/registry_tables_generator/registry_tables_generator.py
Pour mieux comprendre l'API C, consultez: http://code.google.com/p/domain-registry-provider/source/browse/trunk/src/domain_registry/domain_registry.h
la source
Cela ne fonctionne pas exactement, mais vous pourriez peut-être obtenir une réponse utile en essayant de récupérer le domaine morceau par morceau et en vérifiant la réponse, c'est-à-dire en récupérant ' http: // uk ', puis ' http://co.uk ' , puis " http://domain.co.uk ". Lorsque vous obtenez une réponse sans erreur, vous obtenez le domaine et le reste est un sous-domaine.
Parfois tu dois juste l'essayer :)
Éditer:
Tom Leys souligne dans les commentaires que certains domaines sont configurés uniquement sur le sous-domaine www, ce qui nous donnerait une réponse incorrecte dans le test ci-dessus. Bon point! Peut-être que la meilleure approche serait de vérifier chaque partie avec « http: // www » ainsi que «http: //», et compter un hit soit comme un hit pour cette section du nom de domaine? Il nous manquerait encore des arrangements `` alternatifs '' tels que `` web.domain.com '', mais je n'en ai pas rencontré depuis un moment :)
la source
.DK
et certains autres, telhttp://dk/
quel. Ce genre de heuristiques ne sont pas la voie à suivre ...Utilisez URIBuilder puis récupérez l'attribut URIBUilder.host en le divisant en un tableau sur "." vous avez maintenant un tableau avec le domaine divisé.
la source
la source
Je viens d'écrire une bibliothèque objc: https://github.com/kejinlu/KKDomain
la source
Vous pouvez utiliser cette lib tld.js: API JavaScript pour travailler sur des noms de domaine complexes, des sous-domaines et des URI.
Si vous obtenez le domaine racine dans le navigateur. Vous pouvez utiliser cette lib AngusFu / browser-root-domain .
L'utilisation de cookies est délicate.
la source
Si vous cherchez à extraire des sous-domaines et / ou des domaines d'une liste arbitraire d'URL, ce script python peut être utile. Attention cependant, ce n'est pas parfait. C'est un problème délicat à résoudre en général et il est très utile si vous avez une liste blanche de domaines que vous attendez.
la source
Liste des suffixes courants (.co.uk, .com, et cetera) à supprimer avec http: // et vous n'aurez plus que "sub.domain" pour travailler au lieu de " http: // sub. domain.suffix ", ou du moins c'est ce que je ferais probablement.
Le plus gros problème est la liste des suffixes possibles. Il y en a beaucoup, après tout.
la source
Après avoir jeté un coup d'œil à la liste publicuffix.org, il semble que vous puissiez faire une approximation raisonnable en supprimant les trois derniers segments ("segment" signifiant ici une section entre deux points) des domaines où le segment final est long de deux caractères, en supposant qu'il s'agit d'un code de pays et qu'il sera subdivisé ultérieurement. Si le dernier segment est "nous" et que l'avant-dernier segment est également composé de deux caractères, supprimez les quatre derniers segments. Dans tous les autres cas, supprimez les deux derniers segments. par exemple:
"exemple" n'est pas composé de deux caractères, supprimez donc "domain.example" en laissant "www"
"exemple" n'est pas composé de deux caractères, supprimez donc "domain.example" en laissant "super.duper"
"uk" est composé de deux caractères (mais pas "nous"), supprimez donc "domain.co.uk" en laissant "super.duper"
"nous" est composé de deux caractères et "nous", plus "wy" correspond également à deux caractères, supprimez donc "pvt.k12.wy.us" en laissant "foo".
Notez que, bien que cela fonctionne pour tous les exemples que j'ai vus dans les réponses jusqu'à présent, cela ne reste qu'une approximation raisonnable. Ce n'est pas tout à fait correct, même si je soupçonne que c'est à peu près aussi proche que vous pourriez l'obtenir sans faire / obtenir une liste réelle à utiliser comme référence.
la source
.NAME
par exemple, lorsque vous ne pouviez acheter que desfirstname.lastname.name
noms de domaine. Et dans la direction opposée, maintenant.US
est également plat, donc vous pouvez avoirx.y.z.whatever.us
simplement en achetantwhatever.us
au registre et votre algorithme échouera.