Das Abrufen der Subdomain von einer URL klingt zunächst einfach.
http://www.domain.example
Scannen Sie für den ersten Zeitraum und geben Sie dann alles zurück, was nach dem "http: //" ...
Dann erinnerst du dich
http://super.duper.domain.example
Oh. Dann denkst du, okay, finde die letzte Periode, geh ein Wort zurück und hol alles vorher!
Dann erinnerst du dich
http://super.duper.domain.co.uk
Und du bist wieder auf dem ersten Platz. Hat jemand gute Ideen, außer eine Liste aller TLDs zu speichern?
Antworten:
Nein, da sich jede TLD darin unterscheidet, was als Subdomain, Second Level Domain usw. zählt.
Beachten Sie, dass es Domänen der obersten Ebene, Domänen der zweiten Ebene und Unterdomänen gibt. Technisch gesehen ist alles außer der TLD eine Subdomain.
Im Beispiel domain.com.uk ist "domain" eine Subdomain, "com" eine Domain der zweiten Ebene und "uk" die TLD.
Die Frage bleibt also komplexer als auf den ersten Blick und hängt davon ab, wie jede TLD verwaltet wird. Sie benötigen eine Datenbank aller TLDs, die ihre jeweilige Partitionierung enthalten, sowie eine Datenbank der zweiten Ebene und eine Subdomäne. Es gibt jedoch nicht zu viele TLDs, sodass die Liste einigermaßen überschaubar ist, aber das Sammeln all dieser Informationen ist nicht trivial. Möglicherweise ist eine solche Liste bereits verfügbar.
Es sieht so aus, als ob http://publicsuffix.org/ eine solche Liste ist - alle gängigen Suffixe (.com, .co.uk usw.) in einer Liste, die für die Suche geeignet ist. Es wird immer noch nicht einfach sein, es zu analysieren, aber zumindest müssen Sie die Liste nicht pflegen.
Wenn Sie die Liste durchsehen, sehen Sie, dass dies kein triviales Problem ist. Ich denke, eine Liste ist der einzig richtige Weg, um dies zu erreichen ...
quelle
Wie Adam sagt, ist es nicht einfach und derzeit ist der einzige praktische Weg, eine Liste zu verwenden.
Selbst dann gibt es Ausnahmen - zum Beispiel
.uk
gibt es eine Handvoll Domänen, die auf dieser Ebene sofort gültig sind und nicht in der Domäne enthalten sind. Daher.co.uk
müssen diese als Ausnahmen hinzugefügt werden.So machen es derzeit Mainstream-Browser - es muss sichergestellt werden, dass
example.co.uk
kein Cookie gesetzt werden kann, für.co.uk
das dann eine andere Website unter gesendet wird.co.uk
.Die gute Nachricht ist, dass unter http://publicsuffix.org/ bereits eine Liste verfügbar ist .
In der IETF gibt es auch einige Arbeiten , um eine Art Standard zu erstellen, mit dem TLDs deklarieren können, wie ihre Domänenstruktur aussieht. Dies ist zwar etwas kompliziert
.uk.com
, wird jedoch wie ein öffentliches Suffix betrieben, aber nicht von der.com
Registrierung verkauft.quelle
.uk
Domain-Registrierung , seit ich dies geschrieben habe , Registrierungen direkt auf der zweiten Ebene zulässt. Dies spiegelt sich entsprechend in der PSL wider.Publicsuffix.org scheint der richtige Weg zu sein. Es gibt viele Implementierungen, mit denen der Inhalt der Datei mit den öffentlichen Datendateien einfach analysiert werden kann:
quelle
Wie bereits von Adam und John gesagt, ist publicsuffix.org der richtige Weg. Wenn Sie diesen Ansatz jedoch aus irgendeinem Grund nicht verwenden können, finden Sie hier eine Heuristik, die auf einer Annahme basiert, die für 99% aller Domänen funktioniert:
Es gibt eine Eigenschaft, die (nicht alle, aber fast alle) "echte" Domänen von Subdomänen und TLDs unterscheidet, und das ist der MX-Eintrag des DNS. Sie können einen Algorithmus erstellen, der danach sucht: Entfernen Sie die Teile des Hostnamens nacheinander und fragen Sie den DNS ab, bis Sie einen MX-Eintrag finden. Beispiel:
Hier ist ein Beispiel in PHP:
quelle
.ai
oder.ax
um nur einige zu nennen).Wie bereits erwähnt, ist die öffentliche Suffixliste nur eine Möglichkeit, die Domain korrekt zu analysieren. Für PHP können Sie TLDExtract ausprobieren . Hier ist Beispielcode:
quelle
Habe gerade ein Programm dafür in Clojure geschrieben, basierend auf den Informationen von publicsuffix.org:
https://github.com/isaksky/url_dom
Beispielsweise:
quelle
Für eine C-Bibliothek (mit Datentabellengenerierung in Python) habe ich http://code.google.com/p/domain-registry-provider/ geschrieben. was sowohl schnell als auch platzsparend ist.
Die Bibliothek verwendet ~ 30 KB für die Datentabellen und ~ 10 KB für den C-Code. Es gibt keinen Startaufwand, da die Tabellen zur Kompilierungszeit erstellt werden. Weitere Informationen finden Sie unter http://code.google.com/p/domain-registry-provider/wiki/DesignDoc .
Beginnen Sie hier, um den Code zur Tabellengenerierung (Python) besser zu verstehen: http://code.google.com/p/domain-registry-provider/source/browse/trunk/src/registry_tables_generator/registry_tables_generator.py
Weitere Informationen zur C-API finden Sie unter: http://code.google.com/p/domain-registry-provider/source/browse/trunk/src/domain_registry/domain_registry.h
quelle
Es funktioniert nicht genau, aber Sie könnten vielleicht eine nützliche Antwort erhalten, indem Sie versuchen, die Domain Stück für Stück abzurufen und die Antwort zu überprüfen, dh ' http: // uk ' und dann ' http://co.uk ' abrufen. , dann ' http://domain.co.uk '. Wenn Sie eine fehlerfreie Antwort erhalten, haben Sie die Domain und der Rest ist die Subdomain.
Manchmal musst du es einfach versuchen :)
Bearbeiten:
Tom Leys weist in den Kommentaren darauf hin, dass einige Domains nur in der WWW-Subdomain eingerichtet sind, was uns im obigen Test eine falsche Antwort geben würde. Guter Punkt! Vielleicht wäre der beste Ansatz, jedes Teil mit ' http: // www ' sowie 'http: //' zu überprüfen und einen Treffer als Treffer für diesen Abschnitt des Domainnamens zu zählen? Wir würden immer noch einige "alternative" Arrangements wie "web.domain.com" vermissen, aber ich habe eine Weile keine davon getroffen :)
quelle
.DK
und einige andere, sohttp://dk/
wie es ist. Diese Art von Heuristiken sind nicht derVerwenden Sie den URIBuilder und rufen Sie das Attribut URIBUilder.host auf, und teilen Sie es in ein Array auf "." Sie haben jetzt ein Array mit der Domain aufgeteilt.
quelle
quelle
Ich habe gerade eine Objektbibliothek geschrieben: https://github.com/kejinlu/KKDomain
quelle
Sie können diese lib tld.js: JavaScript-API verwenden, um mit komplexen Domänennamen, Subdomänen und URIs zu arbeiten.
Wenn Sie eine Root-Domain im Browser erhalten. Sie können diese lib AngusFu / browser-root-Domain verwenden .
Die Verwendung von Cookies ist schwierig.
quelle
Wenn Sie Subdomains und / oder Domains aus einer beliebigen Liste von URLs extrahieren möchten, kann dieses Python-Skript hilfreich sein. Sei aber vorsichtig, es ist nicht perfekt. Dies ist ein schwieriges Problem, das im Allgemeinen gelöst werden muss. Es ist sehr hilfreich, wenn Sie eine Whitelist mit Domains haben, die Sie erwarten.
quelle
Liste der gebräuchlichen Suffixe (.co.uk, .com usw.), die zusammen mit http: // entfernt werden sollen, und dann haben Sie nur "sub.domain" zum Arbeiten anstelle von " http: // sub". domain.suffix ", oder zumindest würde ich das wahrscheinlich tun.
Das größte Problem ist die Liste möglicher Suffixe. Es gibt schließlich viel.
quelle
Nach einem kurzen Blick auf die Liste publicsuffix.org scheint es, als könnten Sie eine vernünftige Annäherung vornehmen, indem Sie die letzten drei Segmente ("Segment" bedeutet hier einen Abschnitt zwischen zwei Punkten) aus Domänen entfernen, in denen das letzte Segment zwei Zeichen lang ist. unter der Annahme, dass es sich um einen Ländercode handelt, der weiter unterteilt wird. Wenn das letzte Segment "wir" ist und das vorletzte Segment ebenfalls aus zwei Zeichen besteht, entfernen Sie die letzten vier Segmente. In allen anderen Fällen entfernen Sie die letzten beiden Segmente. z.B:
"Beispiel" besteht nicht aus zwei Zeichen. Entfernen Sie daher "domain.example" und lassen Sie "www".
"Beispiel" besteht nicht aus zwei Zeichen. Entfernen Sie daher "domain.example" und lassen Sie "super.duper".
"uk" besteht aus zwei Zeichen (aber nicht "wir"). Entfernen Sie daher "domain.co.uk" und lassen Sie "super.duper".
"us" besteht aus zwei Zeichen und ist "us". "wy" besteht ebenfalls aus zwei Zeichen. Entfernen Sie daher "pvt.k12.wy.us" und lassen Sie "foo".
Beachten Sie, dass dies zwar für alle Beispiele funktioniert, die ich bisher in den Antworten gesehen habe, aber nur eine vernünftige Annäherung bleibt. Es ist nicht ganz korrekt, obwohl ich vermute, dass es ungefähr so nah ist, wie es wahrscheinlich ist, ohne eine tatsächliche Liste zu erstellen / zu erhalten, die als Referenz verwendet werden kann.
quelle
.NAME
, als Sie nurfirstname.lastname.name
Domain-Namen kaufen konnten . Und in entgegengesetzter Richtung ist jetzt.US
auch flach, so dass Sie nurx.y.z.whatever.us
durch den Kaufwhatever.us
bei der Registrierung haben können und dann Ihr Algorithmus darauf fehlschlagen wird.