我有网址http://somesubdomain.domain.com(子域名可能会有所不同,域名始终相同)。需要使用子域名并使用greasemonkey(例如,使用URL domain.com/some/path/here/somesubdomain打开一个新窗口,使用domain.com/some/path/here/somesubdomain)重新加载页面。
答案 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.us
。 pvt.k12.ma.us
是公开后缀,信不信由你!因此,如果您使用了公开后缀列表,则可以通过删除已知后缀将其快速转换为sub.sub.example
。然后你可以在剥去剩余部分的最后一部分(即域名)之后从sub.sub.example
转到sub.sub
。 sub.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 "";
}