Uzyskanie subdomeny z adresu URL wydaje się na początku łatwe.
http://www.domain.example
Przeskanuj pierwszy okres, a następnie zwróć to, co pojawiło się po „http: //” ...
Wtedy sobie przypominasz
http://super.duper.domain.example
O. Więc myślisz: ok, znajdź ostatnią kropkę, cofnij słowo i zbierz wszystko wcześniej!
Wtedy sobie przypominasz
http://super.duper.domain.co.uk
I wróciłeś do punktu wyjścia. Czy ktoś ma jakieś świetne pomysły poza przechowywaniem listy wszystkich domen najwyższego poziomu?
Odpowiedzi:
Nie, ponieważ każda TLD różni się tym, co liczy się jako subdomena, domena drugiego poziomu itp.
Pamiętaj, że istnieją domeny najwyższego poziomu, domeny drugiego poziomu i subdomeny. Technicznie rzecz biorąc, wszystko oprócz TLD jest subdomeną.
W przykładzie domena.com.uk „domena” to subdomena, „com” to domena drugiego poziomu, a „uk” to TLD.
Pytanie pozostaje więc bardziej złożone niż na pierwszy rzut oka i zależy od tego, jak zarządzana jest każda TLD. Będziesz potrzebować bazy danych wszystkich domen TLD, które obejmują ich określone partycjonowanie, oraz tego, co liczy się jako domena drugiego poziomu i subdomena. Nie ma jednak zbyt wielu domen najwyższego poziomu, więc lista jest rozsądnie zarządzana, ale zebranie wszystkich tych informacji nie jest trywialne. Taka lista może już być dostępna.
Wygląda na to, że http://publicsuffix.org/ jest jedną z takich list - wszystkie popularne sufiksy (.com, .co.uk itp.) Na liście nadającej się do wyszukiwania. Nadal nie będzie łatwo go przeanalizować, ale przynajmniej nie musisz utrzymywać listy.
Przeglądając listę , widać, że nie jest to trywialny problem. Myślę, że lista to jedyny właściwy sposób na osiągnięcie tego ...
źródło
http://publicsuffix.org
, opublikowałem kilka funkcji powłoki i bash w oparciu o Twoją odpowiedź: stackoverflow.com/a/63761712/1765658Jak mówi Adam, nie jest to łatwe, a obecnie jedynym praktycznym sposobem jest użycie listy.
Nawet wtedy są wyjątki - na przykład
.uk
istnieje kilka domen, które są ważne od razu na tym poziomie, a które nie są.co.uk
, więc należy je dodać jako wyjątki.Tak obecnie robią to popularne przeglądarki - konieczne jest upewnienie się, że
example.co.uk
nie mogą ustawić pliku cookie,.co.uk
który byłby następnie wysyłany do dowolnej innej witryny pod adresem.co.uk
.Dobra wiadomość jest taka, że jest już dostępna lista pod adresem http://publicsuffix.org/ .
Jest też trochę pracy w IETF stworzeniem pewnego rodzaju standardu umożliwiającego TLD deklarowanie, jak wygląda struktura ich domeny. Jest to nieco skomplikowane przez tego typu
.uk.com
, który działa tak, jakby był publicznym sufiksem, ale nie jest sprzedawany przez.com
rejestr.źródło
.uk
rejestr domen pozwala teraz na rejestrację bezpośrednio na drugim poziomie. Znajduje to odpowiednie odzwierciedlenie w PSL.Wydaje się, że Publicsuffix.org jest właściwą drogą. Istnieje wiele implementacji, które pozwalają łatwo przeanalizować zawartość pliku danych publicsuffix:
źródło
Jak już powiedzieli Adam i John publicsuffix.org jest właściwą drogą. Ale jeśli z jakiegoś powodu nie możesz użyć tego podejścia, oto heurystyka oparta na założeniu, które działa dla 99% wszystkich domen:
Jest jedna właściwość, która odróżnia (nie wszystkie, ale prawie wszystkie) „prawdziwe” domeny od subdomen i TLD, a jest nią rekord MX DNS. Możesz stworzyć algorytm, który wyszukuje to: Usuń części nazwy hosta jeden po drugim i odpytuj DNS, aż znajdziesz rekord MX. Przykład:
Oto przykład w php:
źródło
.ai
lub.ax
żeby wymienić tylko kilka).Jak już wspomniano, lista sufiksów publicznych to tylko jeden sposób na poprawne przeanalizowanie domeny. W przypadku PHP możesz wypróbować TLDExtract . Oto przykładowy kod:
źródło
Właśnie napisałem program do tego w clojure na podstawie informacji z publicsuffix.org:
https://github.com/isaksky/url_dom
Na przykład:
źródło
Dla biblioteki C (z generowaniem tabel danych w Pythonie) napisałem http://code.google.com/p/domain-registry-provider/ który jest szybki i zajmuje miejsca.
Biblioteka wykorzystuje ~ 30kB dla tabel danych i ~ 10kB dla kodu C. Nie ma narzutu związanego z uruchamianiem, ponieważ tabele są konstruowane w czasie kompilacji. Zobacz http://code.google.com/p/domain-registry-provider/wiki/DesignDocWięcej informacji można .
Aby lepiej zrozumieć kod generujący tabele (Python), zacznij tutaj: http://code.google.com/p/domain-registry-provider/source/browse/trunk/src/registry_tables_generator/registry_tables_generator.py
Aby lepiej zrozumieć interfejs API C, zobacz: http://code.google.com/p/domain-registry-provider/source/browse/trunk/src/domain_registry/domain_registry.h
źródło
muszla i grzmotnąć wersje
Oprócz poprawnej odpowiedzi Adama Davisa , chciałbym zamieścić własne rozwiązanie dla tej operacji.
Ponieważ lista jest duża, istnieją trzy z wielu różnych sprawdzonych rozwiązań ...
Najpierw przygotuj swoją listę TLD w ten sposób:
Uwaga:
tac
odwróci listę, aby zapewnić.co.uk
wcześniejsze przetestowanie.uk
.posix wersja powłoki
Testy:
grzmotnąć wersja
Aby zmniejszyć rozwidlenia (uniknąć
myvar=$(function..)
składni), wolę ustawiać zmienne zamiast zrzucać dane wyjściowe na standardowe wyjście, w funkcjach bash:Następnie:
Szybciej grzmotnąć wersja:
Przy takim samym przygotowaniu:
Ten krok jest znacznie wolniejszy, ale
splitDom
funkcja będzie znacznie szybsza:Testy na moim raspberry-pi:
Obie grzmotnąć skrypty zostały przetestowane z:
posixwersja została przetestowana ze szczegółową
for
pętlą, aleWszystkie skrypty testowe generują te same dane wyjściowe:
Pełny skrypt zawierający odczyt pliku i
splitDom
pętlę zajmuje ~ 2m z wersją posix, ~ 1m29s z pierwszym skryptem bash opartym na$tlds
tablicy, ale~22s
z ostatnim skryptem bash opartym na$TLDS
tablicy asocjacyjnej .Więc jeśli wypełnianie tablicy asocjacyjnej jest trudniejsze,
splitDom
funkcja staje się dużo szybsza!źródło
Nie działa to dokładnie, ale być może możesz uzyskać przydatną odpowiedź, próbując pobrać domenę kawałek po kawałku i sprawdzając odpowiedź, tj. Pobierz „ http: // uk ”, a następnie „ http://co.uk ” , a następnie „ http://domain.co.uk ”. Kiedy otrzymasz odpowiedź bez błędu, masz domenę, a reszta to subdomena.
Czasami po prostu musisz spróbować :)
Edytować:
Tom Leys zwraca uwagę w komentarzach, że niektóre domeny zakładane są tylko na subdomenie www, co dałoby nam błędną odpowiedź w powyższym teście. Słuszna uwaga! Może najlepszym podejściem byłoby sprawdzenie każdej części za pomocą „ http: // www ” oraz „http: //” i policzenie trafienia jako trafienia w tej sekcji nazwy domeny? Nadal brakowałoby nam niektórych „alternatywnych” rozwiązań, takich jak „web.domain.com”, ale od jakiegoś czasu nie napotkałem żadnego z nich :)
źródło
.DK
i niektórych innych, tak jakhttp://dk/
działa. Tego rodzaju heurystyki nie sąUżyj URIBuilder, a następnie pobierz atrybut URIBUilder.host i podziel go na tablicę na „.” masz teraz tablicę z podzieloną domeną.
źródło
źródło
Możesz użyć tego lib tld.js: JavaScript API do pracy ze złożonymi nazwami domen, subdomen i URI.
Jeśli pobierasz domenę główną w przeglądarce. Możesz użyć tego lib AngusFu / browser-root-domain .
Używanie plików cookie jest trudne.
źródło
Jeśli chcesz wyodrębnić subdomeny i / lub domeny z dowolnej listy adresów URL, ten skrypt w języku Python może być pomocny. Uważaj jednak, to nie jest idealne. Jest to ogólnie trudny problem do rozwiązania i jest bardzo pomocny, jeśli masz białą listę domen, których się spodziewasz.
źródło
Lista popularnych sufiksów (.co.uk, .com itd.), Które należy usunąć wraz z http: //, a wtedy będziesz mieć tylko „sub.domain” do pracy zamiast „ http: // sub. domain.suffix ”, a przynajmniej tak bym prawdopodobnie zrobił.
Największym problemem jest lista możliwych przyrostków. W końcu jest tego dużo.
źródło
Po szybkim spojrzeniu na listę publicsuffix.org wydaje się, że można dokonać rozsądnego przybliżenia, usuwając ostatnie trzy segmenty („segment” oznacza tutaj sekcję między dwiema kropkami) z domen, w których ostatni segment ma dwa znaki, przy założeniu, że jest to kod kraju i zostanie dalej podzielony. Jeśli ostatni segment to „my”, a przedostatni segment również składa się z dwóch znaków, usuń ostatnie cztery segmenty. We wszystkich innych przypadkach usuń ostatnie dwa segmenty. na przykład:
„Przykład” nie składa się z dwóch znaków, więc usuń „domena.example”, pozostawiając „www”
„przykład” nie składa się z dwóch znaków, więc usuń „domena.example”, pozostawiając „super.duper”
„uk” to dwa znaki (ale nie „us”), więc usuń „domain.co.uk”, pozostawiając „super.duper”
„us” to dwa znaki i to „nas”, a „wy” to także dwa znaki, więc usuń „pvt.k12.wy.us”, pozostawiając „foo”.
Zauważ, że chociaż działa to dla wszystkich przykładów, które widziałem w dotychczasowych odpowiedziach, pozostaje tylko rozsądnym przybliżeniem. Nie jest to całkowicie poprawne, chociaż podejrzewam, że jest tak blisko, jak najprawdopodobniej bez tworzenia / uzyskiwania rzeczywistej listy do wykorzystania w celach informacyjnych.
źródło
.NAME
, kiedy można było kupić tylkofirstname.lastname.name
nazwy domen. I w przeciwnym kierunku, teraz.US
jest również płaski, więc możeszx.y.z.whatever.us
po prostu kupićwhatever.us
w rejestrze, a wtedy twój algorytm się nie powiedzie.