17

I would like to extract the base domain from the url in javascript. For example for the list of urls listed below I need to get google.com (or google.co.in as the case may be) as the result.

www.google.com
www.google.co.in
www.images.google.com
www.images.google.co.in
google.com
google.co.in
images.google.com
images.google.co.in

Any one got some idea on how to do it. There is no direct method to find the base url in javascript i guess.

Mauricio Gracia Gutierrez
  • 10,288
  • 6
  • 68
  • 99
anishenos
  • 201
  • 1
  • 3
  • 6
  • 1
    The term “top level domain” means only last portion (e.g. “com” or “uk”) - see https://en.m.wikipedia.org/wiki/Top-level_domain. The names in the question may be named as “organization level domain” (based on the phrase “Second-level domains commonly refer to the organization that registered the domain name with a domain name registrar” from https://en.m.wikipedia.org/wiki/Second-level_domain) – Michael Freidgeim Aug 29 '18 at 19:02
  • Possible duplicate of [Get the current URL with JavaScript?](https://stackoverflow.com/questions/1034621/get-the-current-url-with-javascript) – divibisan Sep 06 '18 at 22:49

11 Answers11

22

This one works only if you are at the url you want to get the Top Level Hostname.

This function guarantees you get the top-level hostname because that's the smallest one browsers will let you set cookies in. We test if for a given prefix we are able to set cookies, if so we return that otherwise we try the next prefix until we find the one that works.

Will fail if the browser is configured to disallow cookies, or possibly in restricted hostnames such as localhost

function get_top_domain(){
  var i,h,
    weird_cookie='weird_get_top_level_domain=cookie',
    hostname = document.location.hostname.split('.');
  for(i=hostname.length-1; i>=0; i--) {
    h = hostname.slice(i).join('.');
    document.cookie = weird_cookie + ';domain=.' + h + ';';
    if(document.cookie.indexOf(weird_cookie)>-1){
      // We were able to store a cookie! This must be it
      document.cookie = weird_cookie.split('=')[0] + '=;domain=.' + h + ';expires=Thu, 01 Jan 1970 00:00:01 GMT;';
      return h;
    }
  }
}
Eduardo
  • 22,574
  • 11
  • 76
  • 94
  • This worked well for me on all desktop browsers, but seems to fail on Android (tested 2.3). When on www.foo.com I get back "com", instead of "foo.com" – odedbd Oct 23 '12 at 22:36
  • From further testing it seems that the problem is solved by adding a dot (.) to the beginning of the domain string, so- document.cookie = weird_cookie + ';domain=.' + h + ';'; – odedbd Oct 23 '12 at 23:04
  • @odedbd On Android 4 it works fine. Thanks for reporting. I updated the code to include the leading dot on the hostname – Eduardo Oct 23 '12 at 23:28
  • Good answer for the current URL, but I prefer the other answer as it fits more with both what I and the original questioner need. Something that works for any domain. – frabcus Apr 06 '13 at 01:21
  • @frabacus, that's not clear from the question and not a reason to downvote. – Eduardo Apr 07 '13 at 01:58
  • The term “top level domain” means only last portion (e.g. “com” or “uk”) - see http://en.m.wikipedia.org/wiki/Top-level_domain. The names in the question may be named as “organization level domain” – Michael Freidgeim Aug 29 '18 at 19:06
  • 1
    If I wasn’t so tired I’d have come up with this... but sir, thank you for your genius. – Eric Hodonsky Dec 11 '19 at 22:17
  • @MiFreidgeim, Im sure he didnt know he just meant Public Suffix... Maybe also letting him know what you think he means would be helpful. – Eric Hodonsky Dec 11 '19 at 22:19
  • 2
    What amazing out-of-the-box thinking! Kudos to you sir. – supersan Jan 18 '20 at 08:06
8

This depends on just how rigorous you need to be. The full list of valid top-level domains is given here, but the rules given here are possibly more helpful.

A simple, probably incomplete regex:

/[-\w]+\.(?:[-\w]+\.xn--[-\w]+|[-\w]{3,}|[-\w]+\.[-\w]{2})$/i

Usage is something like this (I'm not great with Javascript regex):

var match = HOSTDOMAIN.exec('www.google.co.in');
if (match == null) {
    alert('not a valid domain!');
} else {
    domain = match[0];
}
Simon Buchan
  • 12,707
  • 2
  • 48
  • 55
5

You can try this method

var url = 'https://www.petzlover.com/us/search?pet=1&breed=262';

extractHostname(url,true); //petzlover.com

extractHostname(url); //www.petzlover.com

function extractHostname(url,tld) {
      let hostname;

      //find & remove protocol (http, ftp, etc.) and get hostname
      if (url.indexOf("://") > -1) {
          hostname = url.split('/')[2];
      }else {
          hostname = url.split('/')[0];
      }

      //find & remove port number
      hostname = hostname.split(':')[0];

      //find & remove "?"
      hostname = hostname.split('?')[0];

      if(tld){
        let hostnames = hostname.split('.');
        hostname = hostnames[hostnames.length-2] + '.' + hostnames[hostnames.length-1];
      }

      return hostname;
  }

let url = 'https://www.petzlover.com/us/search?pet=1&breed=262';

let longUrl = 'https://www.fr.petzlover.com/us/search?pet=1&breed=262';

let topLevelDomain = extractHostname(url,true); //petzlover.com
let subDomain = extractHostname(url); //www.petzlover.com
let lengthySubDomain = extractHostname(longUrl); //www.fr.petzlover.com

document.getElementById('top-level-domain').innerHTML = topLevelDomain;
document.getElementById('sub-domain').innerHTML = subDomain;
document.getElementById('lengthy-sub-domain').innerHTML = lengthySubDomain;

    function extractHostname(url,tld) {
          let hostname;
    
          //find & remove protocol (http, ftp, etc.) and get hostname
          if (url.indexOf("://") > -1) {
              hostname = url.split('/')[2];
          }else {
              hostname = url.split('/')[0];
          }
    
          //find & remove port number
          hostname = hostname.split(':')[0];

          //find & remove "?"
          hostname = hostname.split('?')[0];
    
          if(tld){
            let hostnames = hostname.split('.');
            hostname = hostnames[hostnames.length-2] + '.' + hostnames[hostnames.length-1];
          }
    
          return hostname;
      }
span{
  font-weight:bold;
  font-size:16px;
}
<div>Top Level Domain: <span id="top-level-domain"></span> </div>
<div>Including sub Domain: <span id="sub-domain"></span> </div>
<div>Including lengthy sub Domain: <span id="lengthy-sub-domain"></span> </div>
lingeshram
  • 621
  • 9
  • 13
3

You could use document.domain to determine the eTLD+1 of the current page.

When setting document.domain, an error is thrown if the new value is invalid. A plain eTLD is invalid, while an eTLD+1 is valid. The browser internally uses the Public Suffix List to validate new values.

function getDomain() {
    const original = document.domain;
    const parts = location.hostname.split('.');
    let domain = parts.pop();
    while (parts.length) {
        domain = parts.pop() + '.' + domain;
        try {
            document.domain = domain;
            // we found the eTLD+1
            break;
        } catch (e) {
            // eTLDs and eTLD fragments fail
        }
    }
    // reset before returning
    document.domain = original;
    return domain;
}
kevlened
  • 10,846
  • 4
  • 23
  • 17
2

This is quite long but you can use the function extractRootDomain and the sintax is typescript

extractHostname(url: stringType) {
let hostname: string;

// find & remove protocol (http, ftp, etc.) and get hostname

if (url.indexOf("//") > -1) {
  hostname = url.split("/")[2];
} else {
  hostname = url.split("/")[0];
}

// find & remove port number
hostname = hostname.split(":")[0];
// find & remove "?"
hostname = hostname.split("?")[0];

return hostname;
}

// To address those who want the "root domain," use this function:
extractRootDomain(url: string) {
let domain = this.extractHostname(url);
const splitArr = domain.split(".");
const arrLen = splitArr.length;

// extracting the root domain here
// if there is a subdomain
if (arrLen > 2) {
  domain = splitArr[arrLen - 2] + "." + splitArr[arrLen - 1];
  // check to see if it's using a Country Code Top Level Domain (ccTLD) (i.e. ".me.uk")
  if (
    (splitArr[arrLen - 2].length === 2 &&
    splitArr[arrLen - 1].length === 2)
    || this.isTopLevelDomain(domain)
  ) {
    // this is using a ccTLD
    domain = splitArr[arrLen - 3] + "." + domain;
  }
}
return domain;
}

isTopLevelDomain(url: string) {
const tld = [
  "edu.ac",
  "c.se",
  "d.se",
  "e.se",
  "f.se",
  "g.se",
  "h.se",
  "i.se",
  "k.se",
  "m.se",
  "n.se",
  "o.se",
  "s.se",
  "t.se",
  "u.se",
  "w.se",
  "x.se",
  "y.se",
  "z.se",
  "ac.ae",
  "co.ag",
  "co.ao",
  "ed.ao",
  "gv.ao",
  "it.ao",
  "og.ao",
  "pb.ao",
  "gv.at",
  "ac.at",
  "co.at",
  "or.at",
  "id.au",
  "oz.au",
  "nt.au",
  "sa.au",
  "wa.au",
  "pp.az",
  "ac.be",
  "tv.bo",
  "am.br",
  "fm.br",
  "tv.br",
  "co.bw",
  "ab.ca",
  "bc.ca",
  "mb.ca",
  "nb.ca",
  "nf.ca",
  "nl.ca",
  "ns.ca",
  "nt.ca",
  "nu.ca",
  "on.ca",
  "pe.ca",
  "qc.ca",
  "sk.ca",
  "yk.ca",
  "co.cc",
  "co.ck",
  "ac.cn",
  "ah.cn",
  "bj.cn",
  "cq.cn",
  "fj.cn",
  "gd.cn",
  "gs.cn",
  "gz.cn",
  "gx.cn",
  "ha.cn",
  "hb.cn",
  "he.cn",
  "hi.cn",
  "hl.cn",
  "hn.cn",
  "jl.cn",
  "js.cn",
  "jx.cn",
  "ln.cn",
  "nm.cn",
  "nx.cn",
  "qh.cn",
  "sc.cn",
  "sd.cn",
  "sh.cn",
  "sn.cn",
  "sx.cn",
  "tj.cn",
  "xj.cn",
  "xz.cn",
  "yn.cn",
  "zj.cn",
  "us.com",
  "ac.cr",
  "co.cr",
  "ed.cr",
  "fi.cr",
  "go.cr",
  "or.cr",
  "sa.cr",
  "tm.cy",
  "ac.cy",
  "ac.fj",
  "co.fk",
  "ac.fk",
  "tm.fr",
  "co.gg",
  "ac.gn",
  "iz.hr",
  "co.hu",
  "tm.hu",
  "ac.id",
  "co.id",
  "or.id",
  "go.id",
  "ac.il",
  "co.il",
  "co.im",
  "ac.im",
  "co.in",
  "ac.in",
  "ac.ir",
  "co.ir",
  "co.je",
  "ac.jp",
  "ad.jp",
  "co.jp",
  "ed.jp",
  "go.jp",
  "gr.jp",
  "lg.jp",
  "ne.jp",
  "or.jp",
  "co.kr",
  "or.kr",
  "co.ls",
  "id.lv",
  "id.ly",
  "co.ma",
  "tm.mc",
  "tm.mg",
  "co.mu",
  "ac.mw",
  "co.mw",
  "ac.nz",
  "co.nz",
  "co.om",
  "ac.com",
  "ac.pa",
  "tm.ro",
  "nt.ro",
  "pp.ru",
  "ac.ru",
  "ac.rw",
  "co.rw",
  "tv.sd",
  "pp.se",
  "tm.se",
  "fh.se",
  "ab.se",
  "ac.se",
  "bd.se",
  "ac.th",
  "co.th",
  "in.th",
  "go.th",
  "mi.th",
  "or.th",
  "ac.tj",
  "co.tj",
  "go.tj",
  "av.tr",
  "dr.tr",
  "co.tt",
  "co.tz",
  "ac.tz",
  "go.tz",
  "or.tz",
  "ne.tz",
  "ck.ua",
  "cn.ua",
  "cv.ua",
  "dp.ua",
  "dn.ua",
  "if.ua",
  "kh.ua",
  "ks.ua",
  "km.ua",
  "kv.ua",
  "kr.ua",
  "lg.ua",
  "mk.ua",
  "od.ua",
  "pl.ua",
  "rv.ua",
  "te.ua",
  "vn.ua",
  "zp.ua",
  "zt.ua",
  "co.ug",
  "ac.ug",
  "sc.ug",
  "go.ug",
  "ne.ug",
  "or.ug",
  "ac.uk",
  "co.uk",
  "me.uk",
  "bl.uk",
  "ak.us",
  "al.us",
  "ar.us",
  "az.us",
  "ca.us",
  "co.us",
  "ct.us",
  "dc.us",
  "de.us",
  "fl.us",
  "ga.us",
  "hi.us",
  "ia.us",
  "id.us",
  "il.us",
  "in.us",
  "ks.us",
  "ky.us",
  "la.us",
  "ma.us",
  "md.us",
  "me.us",
  "mi.us",
  "mn.us",
  "mo.us",
  "ms.us",
  "mt.us",
  "nc.us",
  "nd.us",
  "ne.us",
  "nh.us",
  "nj.us",
  "nm.us",
  "nv.us",
  "ny.us",
  "oh.us",
  "ok.us",
  "or.us",
  "pa.us",
  "ri.us",
  "sc.us",
  "sd.us",
  "tn.us",
  "tx.us",
  "ut.us",
  "vt.us",
  "va.us",
  "wa.us",
  "wi.us",
  "wv.us",
  "wy.us",
  "co.ve",
  "ac.vn",
  "ac.yu",
  "co.yu",
  "ac.za",
  "co.za",
  "tm.za",
  "co.zm",
  "ac.zm",
  "co.zw",
  "ac.zw",
  "gov.ac",
  "net.ac",
  "mil.ac",
  "org.ac",
  "nom.ad",
  "net.ae",
  "gov.ae",
  "org.ae",
  "mil.ae",
  "sch.ae",
  "pro.ae",
  "gov.af",
  "edu.af",
  "net.af",
  "com.af",
  "com.ag",
  "org.ag",
  "net.ag",
  "nom.ag",
  "off.ai",
  "com.ai",
  "net.ai",
  "org.ai",
  "gov.al",
  "edu.al",
  "org.al",
  "com.al",
  "net.al",
  "upt.al",
  "com.an",
  "net.an",
  "org.an",
  "edu.an",
  "com.ar",
  "gov.ar",
  "int.ar",
  "mil.ar",
  "net.ar",
  "org.ar",
  "ip6.arpa",
  "uri.arpa",
  "urn.arpa",
  "asn.au",
  "com.au",
  "net.au",
  "org.au",
  "act.au",
  "nsw.au",
  "qld.au",
  "tas.au",
  "vic.au",
  "gov.au",
  "edu.au:",
  "com.aw",
  "com.az",
  "net.az",
  "int.az",
  "gov.az",
  "biz.az",
  "org.az",
  "edu.az",
  "mil.az",
  "com.bb",
  "edu.bb",
  "gov.bb",
  "net.bb",
  "org.bb",
  "com.bd",
  "edu.bd",
  "net.bd",
  "gov.bd",
  "org.bd",
  "mil.bd",
  "gov.bf",
  "com.bm",
  "edu.bm",
  "org.bm",
  "gov.bm",
  "net.bm",
  "com.bn",
  "edu.bn",
  "org.bn",
  "net.bn",
  "com.bo",
  "org.bo",
  "net.bo",
  "gov.bo",
  "gob.bo",
  "edu.bo",
  "mil.bo",
  "int.bo",
  "agr.br",
  "art.br",
  "edu.br",
  "com.br",
  "esp.br",
  "far.br",
  "g12.br",
  "gov.br",
  "imb.br",
  "ind.br",
  "inf.br",
  "mil.br",
  "net.br",
  "org.br",
  "psi.br",
  "rec.br",
  "srv.br",
  "tmp.br",
  "tur.br",
  "etc.br",
  "adm.br",
  "adv.br",
  "arq.br",
  "ato.br",
  "bio.br",
  "bmd.br",
  "cim.br",
  "cng.br",
  "cnt.br",
  "ecn.br",
  "eng.br",
  "eti.br",
  "fnd.br",
  "fot.br",
  "fst.br",
  "ggf.br",
  "jor.br",
  "lel.br",
  "mat.br",
  "med.br",
  "mus.br",
  "not.br",
  "ntr.br",
  "odo.br",
  "ppg.br",
  "pro.br",
  "psc.br",
  "qsl.br",
  "slg.br",
  "trd.br",
  "vet.br",
  "zlg.br",
  "dpn.br",
  "nom.br",
  "com.bs",
  "net.bs",
  "org.bs",
  "com.bt",
  "edu.bt",
  "gov.bt",
  "net.bt",
  "org.bt",
  "org.bw",
  "gov.by",
  "mil.by",
  "com.cd",
  "net.cd",
  "org.cd",
  "com.ch",
  "net.ch",
  "org.ch",
  "gov.ch",
  "com.cn",
  "edu.cn",
  "gov.cn",
  "net.cn",
  "org.cn",
  "com.co",
  "edu.co",
  "org.co",
  "gov.co",
  "mil.co",
  "net.co",
  "nom.co",
  "com.cu",
  "edu.cu",
  "org.cu",
  "net.cu",
  "gov.cu",
  "inf.cu",
  "gov.cx",
  "com.cy",
  "biz.cy",
  "ltd.cy",
  "pro.cy",
  "net.cy",
  "org.cy",
  "com.dm",
  "net.dm",
  "org.dm",
  "edu.dm",
  "gov.dm",
  "edu.do",
  "gov.do",
  "gob.do",
  "com.do",
  "org.do",
  "sld.do",
  "web.do",
  "net.do",
  "mil.do",
  "art.do",
  "com.dz",
  "org.dz",
  "net.dz",
  "gov.dz",
  "edu.dz",
  "pol.dz",
  "art.dz",
  "com.ec",
  "net.ec",
  "fin.ec",
  "med.ec",
  "pro.ec",
  "org.ec",
  "edu.ec",
  "gov.ec",
  "mil.ec",
  "com.ee",
  "org.ee",
  "fie.ee",
  "pri.ee",
  "eun.eg",
  "edu.eg",
  "sci.eg",
  "gov.eg",
  "com.eg",
  "org.eg",
  "net.eg",
  "mil.eg",
  "com.es",
  "nom.es",
  "org.es",
  "gob.es",
  "edu.es",
  "com.et",
  "gov.et",
  "org.et",
  "edu.et",
  "net.et",
  "biz.et",
  "biz.fj",
  "com.fj",
  "net.fj",
  "org.fj",
  "pro.fj",
  "gov.fj",
  "mil.fj",
  "org.fk",
  "gov.fk",
  "nom.fk",
  "net.fk",
  "nom.fr",
  "prd.fr",
  "com.fr",
  "com.ge",
  "edu.ge",
  "gov.ge",
  "org.ge",
  "mil.ge",
  "net.ge",
  "pvt.ge",
  "net.gg",
  "org.gg",
  "com.gh",
  "edu.gh",
  "gov.gh",
  "org.gh",
  "mil.gh",
  "com.gi",
  "ltd.gi",
  "gov.gi",
  "mod.gi",
  "edu.gi",
  "org.gi",
  "com.gn",
  "gov.gn",
  "org.gn",
  "net.gn",
  "com.gp",
  "net.gp",
  "edu.gp",
  "org.gp",
  "com.gr",
  "edu.gr",
  "net.gr",
  "org.gr",
  "gov.gr",
  "com.hk",
  "edu.hk",
  "gov.hk",
  "idv.hk",
  "net.hk",
  "org.hk",
  "com.hn",
  "edu.hn",
  "org.hn",
  "net.hn",
  "mil.hn",
  "gob.hn",
  "com.hr",
  "com.ht",
  "net.ht",
  "pro.ht",
  "org.ht",
  "art.ht",
  "pol.ht",
  "rel.ht",
  "med.ht",
  "edu.ht",
  "org.hu",
  "sex.hu",
  "gov.ie",
  "org.il",
  "net.il",
  "k12.il",
  "gov.il",
  "idf.il",
  "ltd.co.im",
  "plc.co.im",
  "net.im",
  "gov.im",
  "org.im",
  "nic.im",
  "net.in",
  "org.in",
  "gen.in",
  "ind.in",
  "nic.in",
  "edu.in",
  "res.in",
  "gov.in",
  "mil.in",
  "gov.ir",
  "net.ir",
  "org.ir",
  "sch.ir",
  "gov.it",
  "net.je",
  "org.je",
  "edu.jm",
  "gov.jm",
  "com.jm",
  "net.jm",
  "org.jm",
  "com.jo",
  "org.jo",
  "net.jo",
  "edu.jo",
  "gov.jo",
  "mil.jo",
  "mie.jp",
  "per.kh",
  "com.kh",
  "edu.kh",
  "gov.kh",
  "mil.kh",
  "net.kh",
  "org.kh",
  "com.kw",
  "edu.kw",
  "gov.kw",
  "net.kw",
  "org.kw",
  "mil.kw",
  "edu.ky",
  "gov.ky",
  "com.ky",
  "org.ky",
  "net.ky",
  "org.kz",
  "edu.kz",
  "net.kz",
  "gov.kz",
  "mil.kz",
  "com.kz",
  "net.lb",
  "org.lb",
  "gov.lb",
  "edu.lb",
  "com.lb",
  "com.lc",
  "org.lc",
  "edu.lc",
  "gov.lc",
  "com.li",
  "net.li",
  "org.li",
  "gov.li",
  "gov.lk",
  "sch.lk",
  "net.lk",
  "int.lk",
  "com.lk",
  "org.lk",
  "edu.lk",
  "ngo.lk",
  "soc.lk",
  "web.lk",
  "ltd.lk",
  "grp.lk",
  "com.lr",
  "edu.lr",
  "gov.lr",
  "org.lr",
  "net.lr",
  "org.ls",
  "gov.lt",
  "mil.lt",
  "gov.lu",
  "mil.lu",
  "org.lu",
  "net.lu",
  "com.lv",
  "edu.lv",
  "gov.lv",
  "org.lv",
  "mil.lv",
  "net.lv",
  "asn.lv",
  "com.ly",
  "net.ly",
  "gov.ly",
  "plc.ly",
  "edu.ly",
  "sch.ly",
  "med.ly",
  "org.ly",
  "net.ma",
  "gov.ma",
  "org.ma",
  "org.mg",
  "nom.mg",
  "gov.mg",
  "prd.mg",
  "com.mg",
  "edu.mg",
  "mil.mg",
  "com.mk",
  "org.mk",
  "com.mo",
  "net.mo",
  "org.mo",
  "edu.mo",
  "gov.mo",
  "org.mt",
  "com.mt",
  "gov.mt",
  "edu.mt",
  "net.mt",
  "com.mu",
  "biz.mv",
  "com.mv",
  "edu.mv",
  "gov.mv",
  "int.mv",
  "mil.mv",
  "net.mv",
  "org.mv",
  "pro.mv",
  "com.mw",
  "edu.mw",
  "gov.mw",
  "int.mw",
  "net.mw",
  "org.mw",
  "com.mx",
  "net.mx",
  "org.mx",
  "edu.mx",
  "gob.mx",
  "com.my",
  "net.my",
  "org.my",
  "gov.my",
  "edu.my",
  "mil.my",
  "edu.ng",
  "com.ng",
  "gov.ng",
  "org.ng",
  "net.ng",
  "gob.ni",
  "com.ni",
  "edu.ni",
  "org.ni",
  "nom.ni",
  "net.ni",
  "mil.no",
  "vgs.no",
  "fhs.no",
  "com.np",
  "org.np",
  "edu.np",
  "net.np",
  "gov.np",
  "mil.np",
  "gov.nr",
  "edu.nr",
  "biz.nr",
  "org.nr",
  "com.nr",
  "net.nr",
  "cri.nz",
  "gen.nz",
  "iwi.nz",
  "mil.nz",
  "net.nz",
  "org.nz",
  "com.om",
  "edu.om",
  "sch.om",
  "gov.om",
  "net.om",
  "org.om",
  "mil.om",
  "biz.om",
  "pro.om",
  "med.om",
  "com.pa",
  "sld.pa",
  "gob.pa",
  "edu.pa",
  "org.pa",
  "net.pa",
  "abo.pa",
  "ing.pa",
  "med.pa",
  "nom.pa",
  "com.pe",
  "org.pe",
  "net.pe",
  "edu.pe",
  "mil.pe",
  "gob.pe",
  "nom.pe",
  "com.pf",
  "org.pf",
  "edu.pf",
  "com.pg",
  "net.pg",
  "com.ph",
  "gov.ph",
  "com.pk",
  "net.pk",
  "edu.pk",
  "org.pk",
  "fam.pk",
  "biz.pk",
  "web.pk",
  "gov.pk",
  "gob.pk",
  "gok.pk",
  "gon.pk",
  "gop.pk",
  "gos.pk",
  "com.pl",
  "biz.pl",
  "net.pl",
  "art.pl",
  "edu.pl",
  "org.pl",
  "ngo.pl",
  "gov.pl",
  "mil.pl",
  "waw.pl",
  "gda.pl",
  "biz.pr",
  "com.pr",
  "edu.pr",
  "gov.pr",
  "net.pr",
  "org.pr",
  "pro.pr",
  "law.pro",
  "med.pro",
  "cpa.pro",
  "edu.ps",
  "gov.ps",
  "sec.ps",
  "plo.ps",
  "com.ps",
  "org.ps",
  "net.ps",
  "com.pt",
  "edu.pt",
  "gov.pt",
  "int.pt",
  "net.pt",
  "org.pt",
  "net.py",
  "org.py",
  "gov.py",
  "edu.py",
  "com.py",
  "com.ro",
  "org.ro",
  "nom.ro",
  "rec.ro",
  "www.ro",
  "com.ru",
  "net.ru",
  "org.ru",
  "msk.ru",
  "int.ru",
  "gov.rw",
  "net.rw",
  "edu.rw",
  "com.rw",
  "int.rw",
  "mil.rw",
  "gov.rw",
  "com.sa",
  "edu.sa",
  "sch.sa",
  "med.sa",
  "gov.sa",
  "net.sa",
  "org.sa",
  "pub.sa",
  "com.sb",
  "gov.sb",
  "net.sb",
  "edu.sb",
  "com.sc",
  "gov.sc",
  "net.sc",
  "org.sc",
  "edu.sc",
  "com.sd",
  "net.sd",
  "org.sd",
  "edu.sd",
  "med.sd",
  "gov.sd",
  "org.se",
  "fhv.se",
  "mil.se",
  "com.sg",
  "net.sg",
  "org.sg",
  "gov.sg",
  "edu.sg",
  "per.sg",
  "idn.sg",
  "edu.sv",
  "com.sv",
  "gob.sv",
  "org.sv",
  "red.sv",
  "gov.sy",
  "com.sy",
  "net.sy",
  "net.th",
  "biz.tj",
  "com.tj",
  "edu.tj",
  "int.tj",
  "net.tj",
  "org.tj",
  "web.tj",
  "gov.tj",
  "mil.tj",
  "com.tn",
  "gov.tn",
  "org.tn",
  "ind.tn",
  "nat.tn",
  "ens.tn",
  "fin.tn",
  "net.tn",
  "gov.to",
  "gov.tp",
  "com.tr",
  "biz.tr",
  "net.tr",
  "org.tr",
  "web.tr",
  "gen.tr",
  "bbs.tr",
  "tel.tr",
  "gov.tr",
  "bel.tr",
  "pol.tr",
  "mil.tr",
  "k12.tr",
  "edu.tr",
  "com.tt",
  "org.tt",
  "net.tt",
  "biz.tt",
  "pro.tt",
  "edu.tt",
  "gov.tt",
  "gov.tv",
  "edu.tw",
  "gov.tw",
  "mil.tw",
  "com.tw",
  "net.tw",
  "org.tw",
  "idv.tw",
  "com.ua",
  "gov.ua",
  "net.ua",
  "edu.ua",
  "org.ua",
  "gov.uk",
  "ltd.uk",
  "mil.uk",
  "mod.uk",
  "net.uk",
  "nic.uk",
  "nhs.uk",
  "org.uk",
  "plc.uk",
  "sch.uk",
  "jet.uk",
  "nel.uk",
  "nls.uk",
  "sch.uk",
  "dni.us",
  "fed.us",
  "isa.us",
  "nsn.us",
  "edu.uy",
  "gub.uy",
  "org.uy",
  "com.uy",
  "net.uy",
  "mil.uy",
  "com.ve",
  "net.ve",
  "org.ve",
  "web.ve",
  "com.vi",
  "org.vi",
  "edu.vi",
  "gov.vi",
  "com.vn",
  "net.vn",
  "org.vn",
  "edu.vn",
  "gov.vn",
  "int.vn",
  "biz.vn",
  "pro.vn",
  "com.ye",
  "net.ye",
  "org.yu",
  "edu.yu",
  "edu.za",
  "gov.za",
  "law.za",
  "mil.za",
  "nom.za",
  "org.za",
  "alt.za",
  "net.za",
  "ngo.za",
  "web.za",
  "org.zm",
  "gov.zm",
  "sch.zm",
  "org.zw",
  "gov.zw",
  "name.ae",
  "e164.arpa",
  "iris.arpa",
  "priv.at",
  "info.au",
  "conf.au",
  "name.az",
  "info.az",
  "coop.br",
  "info.cy",
  "name.cy",
  "asso.dz",
  "info.ec",
  "name.et",
  "info.et",
  "info.fj",
  "name.fj",
  "asso.fr",
  "gouv.fr",
  "asso.gp",
  "from.hr",
  "name.hr",
  "firm.ht",
  "shop.ht",
  "info.ht",
  "asso.ht",
  "coop.ht",
  "gouv.ht",
  "info.hu",
  "priv.hu",
  "2000.hu",
  "bolt.hu",
  "city.hu",
  "film.hu",
  "news.hu",
  "shop.hu",
  "suli.hu",
  "szex.hu",
  "muni.il",
  "firm.in",
  "gifu.jp",
  "nara.jp",
  "saga.jp",
  "oita.jp",
  "kobe.jp",
  "assn.lk",
  "conf.lv",
  "asso.mc",
  "army.mil",
  "navy.mil",
  "aero.mv",
  "coop.mv",
  "info.mv",
  "name.mv",
  "coop.mw",
  "name.my",
  "stat.no",
  "priv.no",
  "info.nr",
  "geek.nz",
  "govt.nz",
  "info.pl",
  "wroc.pl",
  "lodz.pl",
  "info.pr",
  "isla.pr",
  "name.pr",
  "nome.pt",
  "publ.pt",
  "info.ro",
  "arts.ro",
  "firm.ro",
  "info.sd",
  "sshn.se",
  "fhsk.se",
  "name.tj",
  "intl.tn",
  "info.tn",
  "info.tr",
  "name.tr",
  "info.tt",
  "name.tt",
  "game.tw",
  "ebiz.tw",
  "club.tw",
  "kiev.ua",
  "lviv.ua",
  "sumy.ua",
  "kids.us",
  "info.ve",
  "info.vn",
  "name.vn",
  "city.za",
  "uniti.al",
  "soros.al",
  "inima.al",
  "csiro.au",
  "press.cy",
  "aland.fi",
  "adult.ht",
  "perso.ht",
  "sport.hu",
  "agrar.hu",
  "forum.hu",
  "games.hu",
  "hotel.hu",
  "lakas.hu",
  "media.hu",
  "video.hu",
  "iwate.jp",
  "akita.jp",
  "gunma.jp",
  "chiba.jp",
  "tokyo.jp",
  "fukui.jp",
  "aichi.jp",
  "shiga.jp",
  "kyoto.jp",
  "osaka.jp",
  "hyogo.jp",
  "ehime.jp",
  "kochi.jp",
  "hotel.lk",
  "music.mobi",
  "herad.no",
  "maori.nz",
  "store.ro",
  "brand.se",
  "parti.se",
  "press.se",
  "lutsk.ua",
  "rovno.ua",
  "icnet.uk",
  "tirana.al",
  "school.fj",
  "presse.fr",
  "casino.hu",
  "jogasz.hu",
  "reklam.hu",
  "tozsde.hu",
  "utazas.hu",
  "aomori.jp",
  "miyagi.jp",
  "toyama.jp",
  "nagano.jp",
  "kagawa.jp",
  "sendai.jp",
  "nagoya.jp",
  "museum.mv",
  "museum.mw",
  "museum.no",
  "idrett.no",
  "school.nz",
  "museum.om",
  "krakow.pl",
  "poznan.pl",
  "gdansk.pl",
  "slupsk.pl",
  "lublin.pl",
  "komvux.se",
  "lanarb.se",
  "lanbib.se",
  "crimea.ua",
  "odessa.ua",
  "police.uk",
  "health.vn",
  "school.za",
  "in-addr.arpa",
  "ekloges.cy",
  "erotica.hu",
  "erotika.hu",
  "ibaraki.jp",
  "tochigi.jp",
  "saitama.jp",
  "niigata.jp",
  "tottori.jp",
  "shimane.jp",
  "okayama.jp",
  "fukuoka.jp",
  "okinawa.jp",
  "sapporo.jp",
  "weather.mobi",
  "kommune.no",
  "wroclaw.pl",
  "olsztyn.pl.torun.pl",
  "komforb.se",
  "tourism.tn",
  "donetsk.ua",
  "kharkov.ua",
  "kherson.ua",
  "lugansk.ua",
  "poltava.ua",
  "vinnica.ua",
  "vatican.va",
  "ingatlan.hu",
  "konyvelo.hu",
  "hokkaido.jp",
  "yamagata.jp",
  "kanagawa.jp",
  "ishikawa.jp",
  "shizuoka.jp",
  "wakayama.jp",
  "nagasaki.jp",
  "kumamoto.jp",
  "miyazaki.jp",
  "yokohama.jp",
  "kawasaki.jp",
  "warszawa.pl",
  "szczecin.pl",
  "nikolaev.ua",
  "ternopil.ua",
  "uzhgorod.ua",
  "zhitomir.ua",
  "fukushima.jp",
  "yamanashi.jp",
  "hiroshima.jp",
  "yamaguchi.jp",
  "tokushima.jp",
  "kagoshima.jp",
  "folkebibl.no",
  "bialystok.pl",
  "cherkassy.ua",
  "chernigov.ua",
  "parliament.cy",
  "kitakyushu.jp",
  "fylkesbibl.no",
  "chernovtsy.ua",
  "kirovograd.ua",
  "sebastopol.ua",
  "parliament.uk",
  "zaporizhzhe.ua",
  "khmelnitskiy.ua",
  "naturbruksgymn.se",
  "dnepropetrovsk.ua",
  "kommunalforbund.se",
  "ivano-frankivsk.ua",
  "british-library.uk",
  "national-library-scotland.uk",
] ;

return tld.includes(url) ;
}
Mauricio Gracia Gutierrez
  • 10,288
  • 6
  • 68
  • 99
  • This could be out of date as soon as you get it. Mozilla keeps a nice public suffix file, but really the cookie hack is going to use the browsers knowledge which accesses the .dat file or config directly in the browser code, and this is sure to be as up to date as the browser going to the Requested public suffix – Eric Hodonsky Dec 11 '19 at 22:22
0

It loops through the parts of a full hostname and tries to set a cookie on that domain, it will set a cookie at the highest level possible. This function is helpful if you are trying to set the cookie in the base domain

Note: test this code in the respective website browser console, otherwise doesn't work.

function getDomain () {
        var domain =document.domain;
        var i = 0;
        var parts = domain.split('.');
        var value = 'km_' + (new Date()).getTime();
        while (i < (parts.length - 1) && document.cookie.indexOf(value + '=' + value) == -1) {
            domain = parts.slice(-1 - (++i)).join('.');
            document.cookie = value + "=" + value + ";domain=" + domain + ";";
        }
        document.cookie = value + "=;expires=Thu, 01 Jan 1970 00:00:01 GMT;domain=" + domain + ";";
        return domain
}
0

I think the code below will work for most of the simple domain names.

function getTLD() {
    const hostname = window.location.hostname;
    const hostnameArray = hostname.split('.');
    if (hostnameArray.length === 1) return hostname;
    let i = 0;
    for (i = hostnameArray.length - 1; i > -1; i--) {
        if (hostnameArray[i].length > 2 && i !== hostnameArray.length - 1) {
            break;
        }
    }
    let tldArray = [];
    for (let j = i; j < hostnameArray.length; j++) {
        tldArray.push(hostnameArray[j]);
    }
    return tldArray.join('.');
}
Hamees A. Khan
  • 136
  • 1
  • 10
-1

Just just this java script function:

  <script>

    function RedirectUrl() {
      var domain= window.location.hostname;
      var re=/[-\w]+\.(?:[-\w]+\.xn--[-\w]+|[-\w]{3,}|[-\w]+\.[-\w]{2})$/i;
      var Topdomain = re.exec(domain);
      return Topdomain;
    }
    </script>
-3

I had to deal with this today and I settled on:

'www.images.google.co.in'.match(/[^.\s\/]+\.([a-z]{3,}|[a-z]{2}.[a-z]{2})$/)[0]
//=> google.co.in

Note that the rules have changed since many of these answers were submitted.

pguardiario
  • 53,827
  • 19
  • 119
  • 159
-4
(function (){
    var d = document.domain.split('.');
    var i = d.indexOf('google'); 
    return d.slice(i).join('.');
})();
-4

How to get base domain from the URL in JavaScript

document.location.origin

Result: "https://stackoverflow.com"

And sometimes you might also want these:

document.location.hostname

Result: "stackoverflow.com"

document.location.pathname

Result: "/questions/6449340/how-to-get-base-domain-from-the-url-in-javascript/58887093"

jasonleonhard
  • 12,047
  • 89
  • 66