Отримайте протокол, домен та порт з URL-адреси


301

Мені потрібно витягнути повний протокол, домен та порт із заданої URL-адреси. Наприклад:

https://localhost:8181/ContactUs-1.0/contact?lang=it&report_type=consumer
>>>
https://localhost:8181

9
Для тих читачів, які шукають відповіді, де URL-адреса не є поточним місцеположенням, дивіться нижче прийнятої відповіді
Гай Шалнат

Відповіді:


150

спочатку отримайте поточну адресу

var url = window.location.href

Потім просто проаналізуйте цей рядок

var arr = url.split("/");

Ваш URL:

var result = arr[0] + "//" + arr[2]

Сподіваюсь, це допомагає


8
Це працює з рядком URL, коли locationоб’єкт недоступний (js поза браузера!)
Thamme Gowda

У відповіді Девіда Калхуна використовується вбудований аналізатор (як location), але його можна використовувати для будь-якої URL-адреси. Перевірте це акуратно.
Штійн де Вітт

6
Або просто перетворіть його на window.location.href.split('/').slice(0, 3).join('/')
однолінійний

і як би ви це зробили на вузлі?
DDD

5
window.location.origin
int soumen

576
var full = location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: '');

3
@Randomblue Що з цим? Ви отримаєте about://. Однак мені цікаво дізнатися, для чого був би корисний випадок about:blank? Я не впевнений, чи якийсь браузер вводить ресурси плагіна about:blank, але здається, що це може бути єдиний випадок використання.
Шеф

3
Це взагалі не працює, якщо у вас є рядок URL, правда? (тобто вам потрібно бути на location цьому, щоб працювати)
Нік Т

1
Вибачте за пізню відповідь, @NickT. Так, це не так. Будь ласка, використовуйте для цього приємне рішення, яке надає Девід .
Шеф

1
Цю відповідь слід вибрати правильною. Це чисто і використовує стандартний об'єкт розташування.
Mohit Gangrade

14
Не можете використовувати location.hostзамість location.hostname+ location.port?
c24w

180

Жодна з цих відповідей, здається, не повністю стосується питання, яке вимагає довільного URL-адреси, а не конкретного URL-адреси поточної сторінки.

Спосіб 1: Використовуйте API URL (застереження: немає підтримки IE11)

Ви можете використовувати API URL (не підтримується IE11, але доступний у будь-якому іншому місці ).

Це також полегшує доступ до пошукових парам . Ще один бонус: його можна використовувати в Web Worker, оскільки він не залежить від DOM.

const url = new URL('http://example.com:12345/blog/foo/bar?startIndex=1&pageSize=10');

Спосіб 2 (старий спосіб): Використовуйте вбудований аналізатор браузера в DOM

Використовуйте це, якщо вам це потрібно для роботи і на старих браузерах.

//  Create an anchor element (note: no need to append this element to the document)
const url = document.createElement('a');
//  Set href to any path
url.setAttribute('href', 'http://example.com:12345/blog/foo/bar?startIndex=1&pageSize=10');

Це воно!

Вбудований аналізатор браузера вже зробив свою роботу. Тепер ви можете просто взяти потрібні деталі (зауважте, що це працює для обох методів вище):

//  Get any piece of the url you're interested in
url.hostname;  //  'example.com'
url.port;      //  12345
url.search;    //  '?startIndex=1&pageSize=10'
url.pathname;  //  '/blog/foo/bar'
url.protocol;  //  'http:'

Бонус: парами пошуку

Швидше за все, ви, ймовірно, захочете розірвати параметри URL-адреси пошуку, оскільки "? StartIndex = 1 & pageSize = 10" не є надто корисним самостійно.

Якщо ви використовували метод 1 (API API) вище, ви просто використовуєте пошукові параметри:

url.searchParams.get('startIndex');  // '1'

Або отримати всі параметри:

function searchParamsToObj(searchParams) {
  const paramsMap = Array
    .from(url.searchParams)
    .reduce((params, [key, val]) => params.set(key, val), new Map());
  return Object.fromEntries(paramsMap);
}
searchParamsToObj(url.searchParams);
// -> { startIndex: '1', pageSize: '10' }

Якщо ви використовували метод 2 (старий спосіб), ви можете використовувати щось подібне:

// Simple object output (note: does NOT preserve duplicate keys).
var params = url.search.substr(1); // remove '?' prefix
params
    .split('&')
    .reduce((accum, keyval) => {
        const [key, val] = keyval.split('=');
        accum[key] = val;
        return accum;
    }, {});
// -> { startIndex: '1', pageSize: '10' }

link.protocol отримує мені "http:", якщо я перевіряю анкера з "google.com" :-(var link = document.createElement('a'); link.setAttribute('href', 'google.com'); console.log(link.protocol)
eXe

Можливо, ви це робите на httpсторінці? Якщо не вказано, він буде "успадкований" від поточного місця розташування
Stijn de Witt

4
Це фантастична відповідь, і потрібно отримати більше голосів, оскільки ця відповідь не обмежується лише поточним місцеположенням, але працює для будь-якої URL-адреси , і тому, що ця відповідь використовує вбудований аналізатор браузера замість того, щоб будувати один (що ми не можемо сподіваюсь зробити це так само швидко або ж!).
Штійн де Вітт

Дякую за цей розумний трюк! Я хотів би додати одне: Є і те, hostі hostname. Перший включає порт (наприклад localhost:3000), а другий - лише ім'я хоста (наприклад localhost).
кодер

Це добре працює у випадку абсолютної URL-адреси. Він не вдається у випадку відносної URL-адреси та крос-браузера. Будь-які пропозиції?
Гурурай

132

Чомусь усі відповіді - це все зайві надмірності. Це все, що потрібно:

window.location.origin

Більш детальну інформацію можна знайти тут: https://developer.mozilla.org/en-US/docs/Web/API/window.location#Properties


19
FYI, я впевнений, що це буде чудово в майбутньому, коли всі популярні браузери його реалізують, однак , це зараз не так: developer.mozilla.org/en-US/docs/Web/API/… At Час написання лише останніх версій браузерів Firefox та WebKit підтримують властивість початків, відповідно до моїх досліджень.
Zac Seth

2
Просто для завершення: місце розташування визначається на HTML5, і він реалізує URLUtilsінтерфейс, визначений у WHATWG і включає originатрибут.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

5
Привіт з 2015 року. На жаль, URLUtils все ще не належним чином реалізований у всіх браузерах, відповідно до цієї таблиці сумісності в MDN. Однак здається, що майно походження дещо краще підтримується, ніж у 2013 році, воно все ще не підходить для виробництва, оскільки воно не реалізовано належним чином у Safari. Вибачте, хлопці :(
totalNotLizards

Оновлення: досі не підтримується для багатьох браузерів (також сафарі) :( :(
Ahmad hamza

Він також не працює в IE, він повертається "невизначеним".
Сиддхартха Чоуддурі

53

Як уже згадувалося, поки що не повністю підтримується, window.location.originале замість того, щоб використовувати його або створити нову змінну для використання, я вважаю за краще перевірити її, і якщо вона не встановлена ​​для її встановлення.

Наприклад;

if (!window.location.origin) {
  window.location.origin = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port: '');
}

Я фактично писав про це кілька місяців тому . Виправлення для window.location.origin


1
Це перший раз, коли я знаю window.location.origin, що існує. Дякую. ^^
EThaizone Jo

33

господар

var url = window.location.host;

повертає localhost:2679

ім'я хоста

var url = window.location.hostname;

повертає localhost


Дякую!!! Я не міг зрозуміти, чому localhost показується localhost/замість цього localhost:3000.
Тайлер

23

window.location.origin буде достатньо, щоб отримати те саме.


1
Це легко вирішило мою проблему. Дякуємо @intsoumen
Turker Tunali

14

Властивість протоколу встановлює або повертає протокол поточної URL-адреси, включаючи двокрапку (:).

Це означає, що якщо ви хочете отримати лише частину HTTP / HTTPS, ви можете зробити щось подібне:

var protocol = window.location.protocol.replace(/:/g,'')

Для домену ви можете використовувати:

var domain = window.location.hostname;

Для порту ви можете використовувати:

var port = window.location.port;

Майте на увазі, що порт буде порожнім рядком, якщо його не видно в URL-адресі. Наприклад:

Якщо вам потрібно показати 80/443, коли ви не використовуєте порт

var port = window.location.port || (protocol === 'https' ? '443' : '80');

9

Чому б не використовувати:

let full = window.location.origin

3
Додаючи відповідь на старе питання з існуючими відповідями, корисно пояснити, яку нову інформацію приносить ваша відповідь, і визнати, чи минулий час впливає на відповідь.
Джейсон Аллер

8

Дійсно, window.location.origin чудово працює в браузерах, дотримуючись стандартів, але вгадайте, що. IE не відповідає стандартам.

Тому через це саме це працювало для мене в IE, FireFox та Chrome:

var full = location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: '');

але для можливих майбутніх удосконалень, які можуть спричинити конфлікти, я вказав посилання "вікно" перед об'єктом "location".

var full = window.location.protocol+'//'+window.location.hostname+(window.location.port ? ':'+window.location.port: '');

6

Ось рішення, яке я використовую:

const result = `${ window.location.protocol }//${ window.location.host }`;

Редагувати:

Щоб додати сумісність між веб-браузером, використовуйте наступне:

const result = `${ window.location.protocol }//${ window.location.hostname + (window.location.port ? ':' + window.location.port: '') }`;

1
Оновлено, але window.location.hostможе бути не найкращим крос-браузером
nathanfranke

1
Дякую, я додав сумісність між веб-переглядачами до своєї оригінальної відповіді.
JulienRioux


3
var getBasePath = function(url) {
    var r = ('' + url).match(/^(https?:)?\/\/[^/]+/i);
    return r ? r[0] : '';
};

2
Подумайте про пояснення своєї відповіді. Не припускайте, що ОП може зрозуміти значення різних частин вашого коду.
ADyson

3

Спробуйте скористатися регулярним виразом (Regex), який буде дуже корисним, коли ви хочете перевірити / вилучити речі або навіть зробити простий аналіз в JavaScript.

Регекс:

/([a-zA-Z]+):\/\/([\-\w\.]+)(?:\:(\d{0,5}))?/

Демонстрація:

function breakURL(url){

     matches = /([a-zA-Z]+):\/\/([\-\w\.]+)(?:\:(\d{0,5}))?/.exec(url);

     foo = new Array();

     if(matches){
          for( i = 1; i < matches.length ; i++){ foo.push(matches[i]); }
     }

     return foo
}

url = "https://www.google.co.uk:55699/search?q=http%3A%2F%2F&oq=http%3A%2F%2F&aqs=chrome..69i57j69i60l3j69i65l2.2342j0j4&sourceid=chrome&ie=UTF-8"


breakURL(url);       // [https, www.google.co.uk, 55699] 
breakURL();          // []
breakURL("asf");     // []
breakURL("asd://");  // []
breakURL("asd://a"); // [asd, a, undefined]

Тепер ви також можете зробити перевірку.


"Дійсна схема URL-адреси RFC 3986 повинна складатися з" букви та супроводжуватися будь-якою комбінацією букв, цифр, плюс ("+"), періоду (".") Або дефісів ("-"). "- stackoverflow. com / a / 9142331/188833 (Ось урна: ietf: rfc: 3897 (URI) / urn: ietf: rfc: 3897 (IRI). Регекс для схеми: частина URI / IRI в Python: github.com/dgerber /rfc3987/blob/master/rfc3987.py#L147 )
Уес Тернер

2

Простий відповідь, який працює для всіх браузерів:

let origin;

if (!window.location.origin) {
  origin = window.location.protocol + "//" + window.location.hostname + 
     (window.location.port ? ':' + window.location.port: '');
}

origin = window.location.origin;

1

Стиль ES6 з налаштованими параметрами.

/**
 * Get the current URL from `window` context object.
 * Will return the fully qualified URL if neccessary:
 *   getCurrentBaseURL(true, false) // `http://localhost/` - `https://localhost:3000/`
 *   getCurrentBaseURL(true, true) // `http://www.example.com` - `https://www.example.com:8080`
 *   getCurrentBaseURL(false, true) // `www.example.com` - `localhost:3000`
 *
 * @param {boolean} [includeProtocol=true]
 * @param {boolean} [removeTrailingSlash=false]
 * @returns {string} The current base URL.
 */
export const getCurrentBaseURL = (includeProtocol = true, removeTrailingSlash = false) => {
  if (!window || !window.location || !window.location.hostname || !window.location.protocol) {
    console.error(
      `The getCurrentBaseURL function must be called from a context in which window object exists. Yet, window is ${window}`,
      [window, window.location, window.location.hostname, window.location.protocol],
    )
    throw new TypeError('Whole or part of window is not defined.')
  }

  const URL = `${includeProtocol ? `${window.location.protocol}//` : ''}${window.location.hostname}${
    window.location.port ? `:${window.location.port}` : ''
  }${removeTrailingSlash ? '' : '/'}`

  // console.log(`The URL is ${URL}`)

  return URL
}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.