Mendapatkan subdomain dari URL terdengar mudah pada awalnya.
http://www.domain.example
Pindai periode pertama lalu kembalikan apa pun yang muncul setelah "http: //" ...
Kemudian Anda ingat
http://super.duper.domain.example
Oh. Jadi kemudian Anda berpikir, oke, temukan periode terakhir, mundur satu kata dan dapatkan semuanya sebelumnya!
Kemudian Anda ingat
http://super.duper.domain.co.uk
Dan Anda kembali ke titik awal. Adakah yang punya ide bagus selain menyimpan daftar semua TLD?
Jawaban:
Tidak, karena setiap TLD berbeda dalam hal apa yang dianggap sebagai subdomain, domain level kedua, dll.
Perlu diingat bahwa ada domain level teratas, domain level kedua, dan subdomain. Secara teknis, semua kecuali TLD adalah subdomain.
Dalam contoh domain.com.uk, "domain" adalah subdomain, "com" adalah domain level kedua, dan "uk" adalah TLD.
Jadi pertanyaannya tetap lebih kompleks daripada pada blush pertama, dan itu tergantung pada bagaimana setiap TLD dikelola. Anda akan memerlukan database semua TLD yang menyertakan partisi khusus mereka, dan yang dihitung sebagai domain tingkat kedua dan subdomain. Tidak terlalu banyak TLD, jadi daftarnya dapat dikelola dengan wajar, tetapi mengumpulkan semua informasi itu tidaklah sepele. Mungkin sudah ada daftar seperti itu yang tersedia.
Sepertinya http://publicsuffix.org/ adalah salah satu daftar tersebut — semua sufiks umum (.com, .co.uk, dll) dalam daftar yang sesuai untuk pencarian. Masih tidak akan mudah untuk menguraikannya, tetapi setidaknya Anda tidak perlu mempertahankan daftarnya.
Melihat daftar tersebut , Anda dapat melihat bahwa ini bukanlah masalah yang sepele. Saya pikir daftar adalah satu-satunya cara yang benar untuk mencapai ini ...
sumber
Seperti yang dikatakan Adam, itu tidak mudah, dan saat ini satu-satunya cara praktis adalah menggunakan daftar.
Meskipun demikian, ada pengecualian - misalnya,
.uk
ada beberapa domain yang langsung valid di level tersebut tetapi tidak ada.co.uk
, jadi domain tersebut harus ditambahkan sebagai pengecualian.Beginilah cara browser utama melakukan ini - penting untuk memastikan bahwa
example.co.uk
tidak dapat menetapkan Cookie.co.uk
yang kemudian akan dikirim ke situs web lain di bawah.co.uk
.Kabar baiknya adalah sudah ada daftar yang tersedia di http://publicsuffix.org/ .
Ada juga beberapa pekerjaan di IETF untuk membuat semacam standar untuk memungkinkan TLD mendeklarasikan seperti apa struktur domain mereka. Ini agak rumit meskipun oleh
.uk.com
yang sejenis, yang dioperasikan seolah-olah itu adalah sufiks publik, tetapi tidak dijual oleh.com
registri.sumber
.uk
registri domain sekarang mengizinkan pendaftaran langsung di tingkat kedua. Hal ini tercermin dalam PSL.Publicsuffix.org sepertinya cara yang harus dilakukan. Ada banyak implementasi di luar sana untuk mengurai konten file data publicsuffix dengan mudah:
sumber
Seperti yang telah dikatakan oleh Adam dan John publicsuffix.org adalah cara yang tepat untuk melakukannya. Namun, jika karena alasan apa pun Anda tidak dapat menggunakan pendekatan ini, berikut adalah heuristik berdasarkan asumsi yang berfungsi untuk 99% dari semua domain:
Ada satu properti yang membedakan (tidak semua, tetapi hampir semua) domain "nyata" dari subdomain dan TLD dan itu adalah data MX DNS. Anda dapat membuat algoritme yang mencari ini: Hapus bagian dari nama host satu per satu dan minta DNS sampai Anda menemukan data MX. Contoh:
Berikut adalah contoh di php:
sumber
.ai
atau.ax
hanya beberapa nama).Seperti yang sudah dikatakan, Daftar Sufiks Publik hanyalah salah satu cara untuk mengurai domain dengan benar. Untuk PHP Anda dapat mencoba TLDExtract . Berikut adalah contoh kode:
sumber
Baru saja menulis program untuk ini di clojure berdasarkan info dari publicsuffix.org:
https://github.com/isaksky/url_dom
Sebagai contoh:
sumber
Untuk perpustakaan C (dengan pembuatan tabel data dengan Python), saya menulis http://code.google.com/p/domain-registry-provider/ yang cepat dan hemat ruang.
Pustaka menggunakan ~ 30kB untuk tabel data dan ~ 10kB untuk kode C. Tidak ada overhead startup karena tabel dibuat pada waktu kompilasi. Lihat http://code.google.com/p/domain-registry-provider/wiki/DesignDoc untuk detail selengkapnya.
Untuk lebih memahami kode pembuatan tabel (Python), mulailah di sini: http://code.google.com/p/domain-registry-provider/source/browse/trunk/src/registry_tables_generator/registry_tables_generator.py
Untuk lebih memahami C API, lihat: http://code.google.com/p/domain-registry-provider/source/browse/trunk/src/domain_registry/domain_registry.h
sumber
Ini tidak berhasil dengan tepat, tetapi Anda mungkin bisa mendapatkan jawaban yang berguna dengan mencoba mengambil domain sepotong demi sepotong dan memeriksa tanggapannya, yaitu, ambil ' http: // uk ', lalu ' http://co.uk ' , lalu ' http://domain.co.uk '. Ketika Anda mendapatkan respon non-error, Anda mendapatkan domain dan sisanya adalah subdomain.
Terkadang Anda harus mencobanya :)
Edit:
Tom Leys menunjukkan di komentar, bahwa beberapa domain hanya diatur di subdomain www, yang akan memberi kami jawaban yang salah dalam tes di atas. Poin bagus! Mungkin pendekatan terbaik adalah memeriksa setiap bagian dengan ' http: // www ' serta 'http: //', dan menghitung hit sebagai klik untuk bagian nama domain tersebut? Kami masih akan kehilangan beberapa pengaturan 'alternatif' seperti 'web.domain.com', tetapi saya belum mengalami salah satunya untuk sementara waktu :)
sumber
.DK
dan beberapa lainnya, sebagaimanahttp://dk/
berfungsi sebagaimana adanya. Heuristik semacam ini bukanlah cara yang tepat ...Gunakan URIBuilder lalu dapatkan atribut URIBUilder.host membaginya menjadi array di "." Anda sekarang memiliki array dengan domain yang dipisahkan.
sumber
sumber
Saya baru saja menulis perpustakaan objc: https://github.com/kejinlu/KKDomain
sumber
Anda dapat menggunakan lib ini tld.js: JavaScript API ini untuk bekerja pada nama domain, subdomain, dan URI yang kompleks.
Jika Anda mendapatkan domain root di browser. Anda dapat menggunakan lib ini AngusFu / browser-root-domain ini .
Menggunakan cookie itu rumit.
sumber
Jika Anda ingin mengekstrak subdomain dan / atau domain dari daftar sembarang URL, skrip python ini mungkin bisa membantu. Berhati-hatilah, ini tidak sempurna. Ini adalah masalah yang rumit untuk dipecahkan secara umum dan sangat membantu jika Anda memiliki daftar putih domain yang Anda harapkan.
sumber
Daftar sufiks umum (.co.uk, .com, dan lain-lain) untuk dihapus bersama dengan http: // dan kemudian Anda hanya akan memiliki "sub.domain" untuk digunakan alih-alih " http: // sub. domain.suffix ", atau setidaknya itulah yang mungkin akan saya lakukan.
Masalah terbesar adalah daftar sufiks yang memungkinkan. Ada banyak sekali.
sumber
Setelah melihat sekilas daftar publicsuffix.org, tampaknya Anda dapat membuat perkiraan yang masuk akal dengan menghapus tiga segmen terakhir ("segmen" di sini berarti bagian antara dua titik) dari domain yang segmen terakhirnya terdiri dari dua karakter, dengan asumsi bahwa itu adalah kode negara dan akan dibagi lagi. Jika segmen terakhir adalah "kami" dan segmen kedua hingga terakhir juga terdiri dari dua karakter, hapus empat segmen terakhir. Di semua kasus lainnya, hapus dua segmen terakhir. misalnya:
"contoh" bukan dua karakter, jadi hapus "domain.example", biarkan "www"
"contoh" bukan dua karakter, jadi hapus "domain.example", biarkan "super.duper"
"uk" adalah dua karakter (tapi bukan "us"), jadi hapus "domain.co.uk", biarkan "super.duper"
"us" adalah dua karakter dan merupakan "us", ditambah "wy" juga dua karakter, jadi hapus "pvt.k12.wy.us", biarkan "foo".
Perhatikan bahwa, meskipun ini berfungsi untuk semua contoh yang telah saya lihat dalam tanggapan sejauh ini, itu tetap hanya perkiraan yang masuk akal. Ini tidak sepenuhnya benar, meskipun saya curiga ini sedekat mungkin yang Anda dapatkan tanpa membuat / mendapatkan daftar aktual untuk digunakan sebagai referensi.
sumber
.NAME
misalnya, ketika Anda hanya dapat membelifirstname.lastname.name
nama domain. Dan dalam arah yang berlawanan, sekarang.US
juga datar, jadi Anda dapat memilikix.y.z.whatever.us
hanya dengan membeliwhatever.us
di registri dan kemudian algoritme Anda akan gagal.