URL에서 하위 도메인을 가져 오는 것은 처음에는 쉽습니다.
http://www.domain.example
첫 번째 마침표를 검색 한 다음 “http : //”다음에 오는 모든 것을 반환합니다. …
그럼 당신은 기억 해요
http://super.duper.domain.example
오. 그래서 당신은 생각합니다. 좋아, 마지막 기간을 찾고, 한 단어로 돌아가서 이전에 모든 것을 얻으십시오!
그럼 당신은 기억 해요
http://super.duper.domain.co.uk
그리고 당신은 원점으로 돌아 왔습니다. 누구나 모든 TLD 목록을 저장하는 것 외에 훌륭한 아이디어가 있습니까?
답변
누구나 모든 TLD 목록을 저장하는 것 외에 훌륭한 아이디어가 있습니까?
아니요, 각 TLD는 하위 도메인, 두 번째 수준 도메인 등으로 간주되는 항목이 다르기 때문입니다.
최상위 도메인, 두 번째 수준 도메인 및 하위 도메인이 있습니다. 기술적으로 말하면 TLD를 제외한 모든 것이 하위 도메인입니다.
domain.com.uk 예에서 “domain”은 하위 도메인, “com”은 두 번째 수준 도메인, “uk”는 TLD입니다.
따라서 질문은 처음 붉어지는 것보다 더 복잡하며 각 TLD가 어떻게 관리되는지에 따라 다릅니다. 특정 파티셔닝을 포함하는 모든 TLD의 데이터베이스와 두 번째 수준 도메인 및 하위 도메인으로 간주되는 항목이 필요합니다. 하지만 TLD가 너무 많지 않기 때문에 목록을 합리적으로 관리 할 수 있지만 모든 정보를 수집하는 것은 간단하지 않습니다. 이러한 목록이 이미있을 수 있습니다.
http://publicsuffix.org/ 가 이러한 목록 중 하나 인 것처럼 보입니다 . 검색에 적합한 목록의 모든 일반적인 접미사 (.com, .co.uk 등)입니다. 여전히 파싱하기는 쉽지 않지만 적어도 목록을 유지할 필요는 없습니다.
“공용 접미사”는 인터넷 사용자가 이름을 직접 등록 할 수있는 접미사입니다. 공개 접미사의 예로는 “.com”, “.co.uk”및 “pvt.k12.wy.us”가 있습니다. 공용 접미사 목록은 알려진 모든 공용 접미사 목록입니다.
공용 접미사 목록은 Mozilla 재단의 이니셔티브입니다. 모든 소프트웨어에서 사용할 수 있지만 원래 브라우저 제조업체의 요구를 충족하기 위해 만들어졌습니다. 예를 들어 브라우저는 다음을 수행 할 수 있습니다.
- 높은 수준의 도메인 이름 접미사에 개인 정보를 손상시키는 “슈퍼 쿠키”가 설정되지 않도록합니다.
- 사용자 인터페이스에서 도메인 이름의 가장 중요한 부분을 강조
- 사이트별로 기록 항목을 정확하게 정렬
목록을 살펴보면 사소한 문제가 아니라는 것을 알 수 있습니다. 나는 목록이 이것을 달성하는 유일한 올바른 방법이라고 생각합니다 …
답변
Adam이 말했듯이 쉽지는 않으며 현재 유일한 실용적인 방법은 목록을 사용하는 것입니다.
그럼에도 불구하고 예외가 있습니다. 예를 들어에 .uk
없는 해당 수준에서 즉시 유효한 소수의 도메인이 .co.uk
있으므로 예외로 추가해야합니다.
이것이 현재 주류 브라우저가이 작업을 수행하는 방식 example.co.uk
입니다. 쿠키를 설정할 수 없는지 확인 .co.uk
하여 .co.uk
.
좋은 소식은 이미 http://publicsuffix.org/에 목록이 있다는 것 입니다.
IETF 에는 TLD가 도메인 구조가 어떻게 생겼는지 선언 할 수 있도록 일종의 표준을 만드는 작업도 있습니다 . 이것은 마치 .uk.com
공개 접미사 인 것처럼 작동하지만 .com
레지스트리에서 판매되지 않는와 같은 경우에 약간 복잡 합니다 .
답변
Publicsuffix.org가 그 방법 인 것 같습니다. publicsuffix 데이터 파일 파일의 내용을 쉽게 구문 분석 할 수있는 많은 구현이 있습니다.
- Perl : 도메인 :: PublicSuffix
- 자바 : http://sourceforge.net/projects/publicsuffix/
- PHP : php-domain-parser
- C # / .NET : https://github.com/danesparza/domainname-parser
- Python : http://pypi.python.org/pypi/publicsuffix
- 루비 : domainatrix , public_suffix
답변
Adam과 John이 이미 말했듯이 publicsuffix.org 는 올바른 방법입니다. 그러나 어떤 이유로 든이 접근 방식을 사용할 수없는 경우 모든 도메인의 99 %에 대해 작동하는 가정에 기반한 휴리스틱이 있습니다.
“실제”도메인을 하위 도메인 및 TLD와 구별하는 속성이 하나 있습니다 (모두는 아니지만 거의 모두). 이것이 바로 DNS의 MX 레코드입니다. 이를 검색하는 알고리즘을 만들 수 있습니다. 호스트 이름의 일부를 하나씩 제거하고 MX 레코드를 찾을 때까지 DNS를 쿼리합니다. 예:
super.duper.domain.co.uk => no MX record, proceed
duper.domain.co.uk => no MX record, proceed
domain.co.uk => MX record found! assume that's the domain
다음은 PHP의 예입니다.
function getDomainWithMX($url) {
//parse hostname from URL
//http://www.example.co.uk/index.php => www.example.co.uk
$urlParts = parse_url($url);
if ($urlParts === false || empty($urlParts["host"]))
throw new InvalidArgumentException("Malformed URL");
//find first partial name with MX record
$hostnameParts = explode(".", $urlParts["host"]);
do {
$hostname = implode(".", $hostnameParts);
if (checkdnsrr($hostname, "MX")) return $hostname;
} while (array_shift($hostnameParts) !== null);
throw new DomainException("No MX record found");
}
답변
이미 말했듯이 공용 접미사 목록 은 도메인을 올바르게 구문 분석하는 유일한 방법입니다. PHP의 경우 TLDExtract 를 사용해 볼 수 있습니다 . 다음은 샘플 코드입니다.
$extract = new LayerShifter\TLDExtract\Extract();
$result = $extract->parse('super.duper.domain.co.uk');
$result->getSubdomain(); // will return (string) 'super.duper'
$result->getSubdomains(); // will return (array) ['super', 'duper']
$result->getHostname(); // will return (string) 'domain'
$result->getSuffix(); // will return (string) 'co.uk'
답변
publicsuffix.org의 정보를 기반으로 clojure에이 프로그램을 작성했습니다.
https://github.com/isaksky/url_dom
예를 들면 :
(parse "sub1.sub2.domain.co.uk")
;=> {:public-suffix "co.uk", :domain "domain.co.uk", :rule-used "*.uk"}
답변
C 라이브러리 (Python에서 데이터 테이블 생성 포함)의 경우 빠르고 공간 효율적인 http://code.google.com/p/domain-registry-provider/ 를 작성했습니다 .
라이브러리는 데이터 테이블에 ~ 30kB를 사용하고 C 코드에 ~ 10kB를 사용합니다. 컴파일 시간에 테이블이 구성되므로 시작 오버 헤드가 없습니다. 자세한 내용은 http://code.google.com/p/domain-registry-provider/wiki/DesignDoc 을 참조하세요.
테이블 생성 코드 (Python)를 더 잘 이해하려면 여기에서 시작하십시오. http://code.google.com/p/domain-registry-provider/source/browse/trunk/src/registry_tables_generator/registry_tables_generator.py
C API를 더 잘 이해하려면 다음을 참조하십시오. http://code.google.com/p/domain-registry-provider/source/browse/trunk/src/domain_registry/domain_registry.h