获取子域名并使用greasemonkey将其加载到URL

时间:2009-08-15 20:07:49

标签: javascript url greasemonkey

我有网址http://somesubdomain.domain.com(子域名可能会有所不同,域名始终相同)。需要使用子域名并使用greasemonkey(例如,使用URL domain.com/some/path/here/somesubdomain打开一个新窗口,使用domain.com/some/path/here/somesubdomain)重新加载页面。

6 个答案:

答案 0 :(得分:45)

var full = window.location.host
//window.location.host is subdomain.domain.com
var parts = full.split('.')
var sub = parts[0]
var domain = parts[1]
var type = parts[2]
//sub is 'subdomain', 'domain', type is 'com'
var newUrl = 'http://' + domain + '.' + type + '/your/other/path/' + subDomain
window.open(newUrl);

答案 1 :(得分:16)

Derek提供的答案将适用于最常见的情况,但不适用于" xxx.xxx"子域名,或" host.co.uk"。 (另外,使用window.location.host,还将检索未处理的端口号:http://www.w3schools.com/jsref/prop_loc_host.asp

老实说,我没有看到解决这个问题的完美解决方案。 就个人而言,我已经创建了一种主机名拆分方法,我经常使用它,因为它涵盖了大量的主机名。

此方法将主机名拆分为{domain: "", type: "", subdomain: ""}

function splitHostname() {
        var result = {};
        var regexParse = new RegExp('([a-z\-0-9]{2,63})\.([a-z\.]{2,5})$');
        var urlParts = regexParse.exec(window.location.hostname);
        result.domain = urlParts[1];
        result.type = urlParts[2];
        result.subdomain = window.location.hostname.replace(result.domain + '.' + result.type, '').slice(0, -1);;
        return result;
}

console.log(splitHostname());

此方法仅将子域名作为字符串返回:

function getSubdomain(hostname) {
        var regexParse = new RegExp('[a-z\-0-9]{2,63}\.[a-z\.]{2,5}$');
        var urlParts = regexParse.exec(hostname);
        return hostname.replace(urlParts[0],'').slice(0, -1);
}

console.log(getSubdomain(window.location.hostname));
// for use in node with express:  getSubdomain(req.hostname)

这两种方法适用于大多数常见域名(包括co.uk) 注意:子域末尾的slice将删除额外的点。

我希望这能解决你的问题。

答案 2 :(得分:3)

这里提供的解决方案可以在某些时间工作,甚至大部分时间工作,但不是在任何地方工作。据我所知,找到任何域的完整子域名的最佳方法(并且记住,有时子域名也包含句点!您可以拥有子域名等)是使用Public Suffix List,由Mozilla维护。

公共后缀列表中不包含的URL部分是子域加上域本身,由点连接。删除公共后缀后,您可以通过删除点之间的最后一段来删除域并仅保留子域。

让我们看一个复杂的例子。说你正在测试sub.sub.example.pvt.k12.ma.uspvt.k12.ma.us是公开后缀,信不信由你!因此,如果您使用了公开后缀列表,则可以通过删除已知后缀将其快速转换为sub.sub.example。然后你可以在剥去剩余部分的最后一部分(即域名)之后从sub.sub.example转到sub.subsub.sub是您的子域名。

答案 3 :(得分:0)

除了@jlbang提到的

之外,这在大多数情况下都可行

const split=location.host.split(".");
let subdomain="";
let domain="";
if(split.length==1){//localHost
  domain=split[0];
}else if(split.length==2){//sub.localHost or example.com
  if(split[1].includes("localhost")){//sub.localHost
    domain=split[1];
    subdomain=split[0];
  }else{//example.com
    domain=split.join(".");
  }
}else{//sub2.sub.localHost or sub2.sub.example.com or sub.example.com or example.com.ec sub.example.com.ec or  ... etc
  const last=split[split.length-1];
  const lastLast=split[split.length-2];
  if(last.includes("localhost")){//sub2.sub.localHost
    domain=last;
    subdomain=split.slice(0,split.length-1).join(".");
  }else if(last.length==2 && lastLast.length<=3){//example.com.ec or sub.example.com.ec
    domain=split.slice(split.length-3,split.length).join(".");
    if(split.length>3){//sub.example.com.ec
      subdomain=split.slice(0,split.length-3).join(".");
    }
  }else{//sub2.sub.example.com
    domain=split.slice(split.length-2,split.length).join(".");
    subdomain=split.slice(0,split.length-2).join(".");
  }
}
const newUrl = 'http://example.com/some/path/here/' + subDomain

答案 4 :(得分:0)

我在现代 Typescript 中改编了 Vlad 的解决方案:

const splitHostname = (
    hostname: string
  ): { domain: string; type: string; subdomain: string } | undefined => {
    var urlParts = /([a-z-0-9]{2,63}).([a-z.]{2,5})$/.exec(hostname);
    if (!urlParts) return;
    const [, domain, type] = urlParts;
    const subdomain = hostname.replace(`${domain}.${type}`, "").slice(0, -1);
    return {
      domain,
      type,
      subdomain,
    };
  };

答案 5 :(得分:0)

从 URL 获取子域

function getSubdomain(url) {
url = url.replace( "https://www.","");
url = url.replace( "http://www.","");
url = url.replace( "https://","");
url = url.replace("http://", "");
var temp = url.split("/");
if (temp.length > 0) {
    var temp2 = temp[0].split(".");
    if (temp2.length > 2) {
        return temp2[0];
    }
    else {
        return "";
    }
}
return "";

}