Як витягти частину URL-адреси імені хоста в JavaScript


379

Чи є дійсно простий спосіб почати з повної URL-адреси:

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

І витягніть лише головну частину:

aaa.bbb.ccc.com

Повинна бути функція JavaScript, яка робить це надійно, але я не можу її знайти.

Відповіді:


826

Припустимо , що у вас є сторінка з цією адресою: 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*****

Оновлення: про .origin

***** Як реф стану, сумісність браузера для 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 використовуючи IDE javascript, як WebStorm, ви можете побачити можливі варіанти під час написання коду.
Bhargav Nanekalva

3
window.location.originне визначено в IE9 (за посиланням, це IE11 +). Ця відповідь допомогла.
Neolisk

1
Очевидно, що корисно майже для всіх, за винятком того, що воно не дає відповіді на питання, як вилучити частину хоста з URL-адреси. Смішна правильна відповідь за допомогою функції getRootUrl має лише 17 проти 609 голосів.
Миро

@Miro на запитання відповіли, чи не так, 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
Дякую! Мені також подобається 2-й метод! особливо коли на сервері JavaScript 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
Анант

але іноді ви хочете додати щось на зразок піддомену між протоколом та іменем хосту, наприклад, багатомовним тощо.
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.