У меня есть URL http://somesubdomain.domain.com (субдомены могут меняться, домен всегда один и тот же). Необходимо взять субдомен и перезагрузить страницу чем-то вроде domain.com/some/path/here/somesubdomain, используя greasemonkey (или открыть новое окно с URL-адресом domain.com/some/path/here/somesubdomain, что угодно).
Получите субдомен и загрузите его в URL с помощью greasemonkey
Ответ 1
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);
Ответ 2
Ответ, предоставленный Дереком, будет работать в большинстве распространенных случаев, но не будет работать для поддоменов "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
в конце поддоменов должен удалить лишнюю точку.
Я надеюсь, что это решит вашу проблему.
Ответ 3
Решения, предлагаемые здесь, работают некоторое время или даже в большинстве случаев, но не везде. Насколько я знаю, лучший способ найти полный субдомен любого домена (и помните, иногда субдомены имеют периоды в них тоже! У вас могут быть субдодомены и т.д.), Чтобы использовать Public Suffix List, который поддерживается Mozilla.
Часть URL-адреса, отсутствующего в списке Public Suffix List, является субдоменом плюс сам домен, соединенный точкой. После удаления общедоступного суффикса вы можете удалить домен и оставить только поддомен, удалив последний сегмент между точками.
Посмотрим на сложный пример. Скажем, вы тестируете sub.sub.example.pvt.k12.ma.us
. pvt.k12.ma.us
- публичный суффикс, верьте или нет! Поэтому, если вы использовали публичный список суффикса, вы сможете быстро превратить это в sub.sub.example
, удалив известный суффикс. Затем вы можете перейти от sub.sub.example
к просто sub.sub
после снятия последней части оставшихся частей, которая была доменом. sub.sub
- ваш поддомен.
Ответ 4
Это может работать в большинстве случаев, за исключением того, что упоминается @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