Как извлечь часть имени хоста из URL в JavaScript


379

Есть ли действительно простой способ начать с полного URL:

document.location.href = "http://aaa.bbb.ccc.com/asdf/asdf/sadf.aspx?blah"

И извлеките только часть узла:

aaa.bbb.ccc.com

Должна быть функция JavaScript, которая делает это надежно, но я не могу ее найти.

Ответы:


828

Предположим , что у вас есть страница с этим адресом: http://sub.domain.com/virtualPath/page.htm. используйте следующее в коде страницы для достижения этих результатов:

  • window.location.host: вы получите sub.domain.com:8080илиsub.domain.com:80
  • window.location.hostname : ты получишь sub.domain.com
  • window.location.protocol : ты получишь http:
  • window.location.port: вы получите 8080или80
  • window.location.pathname : ты получишь /virtualPath
  • window.location.origin: ты получишь http://sub.domain.com*****

Обновление: о .оригине

***** Как говорится в ссылке , совместимость браузера для window.location.originне ясна. Я проверил его в Chrome, и он вернулся, http://sub.domain.com:portесли порт не 80, и http://sub.domain.comесли порт 80.

Отдельное спасибо @torazaburo за упоминание об этом мне.


У меня есть веб-сайт и 2 приложения в IIS. Например: sub.domain.com/v1 и sub.domain.com/v2 и такие страницы, как sub.domain.com/v1/Default.aspx или sub.domain.com/v2/Products/Default.aspx и т. Д. Как я могу можно получить значение / v2 , корень для моего приложения sub.domain.com/v2 ?
Kiquenet

@Kiquenet использует javascript IDE, такой как WebStorm, вы можете увидеть возможные варианты при написании кода.
Бхаргав Нанекалва

3
window.location.originв IE9 не определено (по ссылке это IE11 +). Этот ответ помог.
Неолиск,

1
Очевидно, полезно почти для всех, за исключением того, что он не отвечает на вопрос о том, как извлечь часть хоста из URL. Забавно, правильный ответ с функцией getRootUrl имеет только 17 против 609 голосов.
Миро

@ Миро, на который дан ответ, не так ли, 2-ой пункт отвечает на вопрос: window.location.hostname: вы получите sub.domain.com
Пол

155

Вы можете объединить протокол местоположения и хост:

var root = location.protocol + '//' + location.host;

Для URL, скажем 'http://stackoverflow.com/questions', он вернется'http://stackoverflow.com'


5
Похоже, вы должны использовать «имя хоста», а не «хост» для достижения вышеуказанных результатов. Источник: stackoverflow.com/questions/6725890/...
user417669

Вы можете использовать location.origin с тем же результатом.
Сержио

1
Исходный вопрос не запрашивал протокольную часть URL.
Саймон Ист

36

Использование document.locationобъекта и его hostили hostnameсвойства.

alert(document.location.hostname); // alerts "stackoverflow.com"

29

Принятый ответ не работал для меня, так как хотел иметь возможность работать с любыми произвольными URL-адресами, а не только с URL текущей страницы.

Посмотрите на URLобъект :

var url = new URL("http://aaa.bbb.ccc.com/asdf/asdf/sadf.aspx?blah");
url.protocol;  // "http:"
url.hostname;  // "aaa.bbb.ccc.com"
url.pathname;  // "/asdf/asdf/sadf.aspx"
url.search;    // "?blah"

1
Спасибо. В течение нескольких часов я искал способ извлечь URL, который я получаю из API. Это было так просто. Я только прочитал это в URL с новым URL. Спасибо.
Nodirabegimxonoyim

1
+99999999999999
ADJenks

Один из двух ответов здесь, которые не предполагают, что вы на стороне браузера вещей ...
Will59

не работает на IE11 :(
Teoman shipahi

24

Есть два пути. Первый вариант другого ответа здесь, но этот учитывает порты не по умолчанию:

function getRootUrl() {
  var defaultPorts = {"http:":80,"https:":443};

  return window.location.protocol + "//" + window.location.hostname
   + (((window.location.port)
    && (window.location.port != defaultPorts[window.location.protocol]))
    ? (":"+window.location.port) : "");
}

Но я предпочитаю этот более простой метод (который работает с любой строкой URI):

function getRootUrl(url) {
  return url.toString().replace(/^(.*\/\/[^\/?#]*).*$/,"$1");
}

3
Спасибо! Мне тоже больше нравится второй способ! особенно когда на стороне сервера javascript, нет возможности получить window.location :)
триллионы

Один из двух ответов здесь, которые не предполагают, что вы на стороне браузера ... Но посмотрите более свежий ответ от Мартина Конечни, используя новый URL.
Will59



3

Есть еще один хак, который я использую и никогда не видел ни в одном ответе StackOverflow: использование атрибута изображения «src» даст полный базовый путь вашего сайта. Например :

var dummy = new Image;
dummy.src = '$';                  // using '' will fail on some browsers
var root = dummy.src.slice(0,-1); // remove trailing '$'

На URL, как http://domain.com/somesite/index.html, rootбудет установлено значение http://domain.com/somesite/. Это также работает для localhost или любого действующего базового URL.

Обратите внимание, что это приведет к неудачному HTTP-запросу к $фиктивному изображению. Вместо этого вы можете использовать существующее изображение, только с небольшими изменениями кода.

В другом варианте используется фиктивная ссылка, без побочных эффектов на HTTP-запросы:

var dummy = document.createElement ('a');
dummy.href = '';
var root = dummy.href;

Я не проверял это на каждом браузере, все же.


3

Проверь это:

alert(window.location.hostname);

это вернет имя хоста как www.domain.com

а также:

window.location.host

вернет доменное имя с портом как www.example.com:80

Для полной справки проверьте сайт разработчика Mozilla .


2

Я хотел бы указать что-то. Если кто-то хочет получить весь URL-адрес с нужным мне путем, можно использовать:

var fullUrl = window.location.protocol + "//" + window.location.hostname + window.location.pathname;

зачем идти длинным путем Его можно получить с помощью var fullUrl = window.location.origin + window.location.pathname
Anant

но иногда вы хотите добавить что-то вроде субдомена между протоколом и именем хоста, например, мультиязычность и т. д.
crx4

2

Я знаю, что это немного поздно, но я сделал чистую маленькую функцию с небольшим синтаксисом ES6

function getHost(href){
  return Object.assign(document.createElement('a'), { href }).host;
}

Это также может быть написано в ES5, как

function getHost(href){
  return Object.assign(document.createElement('a'), { href: href }).host;
}

Конечно, IE не поддерживает Object.assign, но в моей работе это не имеет значения.


1

Regex обеспечивает гораздо большую гибкость.

    //document.location.href = "http://aaa.bbb.ccc.com/asdf/asdf/sadf.aspx?blah
    //1.
     var r = new RegExp(/http:\/\/[^/]+/);
     var match = r.exec(document.location.href) //gives http://aaa.bbb.ccc.com

    //2. 
     var r = new RegExp(/http:\/\/[^/]+\/[^/]+/);
     var match = r.exec(document.location.href) //gives http://aaa.bbb.ccc.com/asdf
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.