Получить протокол, домен и порт из 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, но похоже, что это может быть единственным вариантом использования.
— Shef

3
Это не работает вообще, если у вас есть строка URL, верно? (т. е. вам нужно быть на месте, location чтобы это работало)
— Ник Т

1
Извините за поздний ответ, @NickT. Да, это не так. Пожалуйста, используйте хорошее решение, предоставленное Дэвидом для этого.
— Шеф

1
Этот ответ должен быть выбран в качестве правильного ответа. Он чистый и использует стандартный объект местоположения.
— Мохит Ганград

14
Вы не можете использовать location.hostвместо location.hostname+ location.port?
— c24w

180

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

Метод 1: Используйте API URL (предостережение: нет поддержки IE11)

Вы можете использовать URL API (не поддерживается 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 (URL API) выше, вы просто используете геттеры searchParams:

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 и кросс-браузер. Какие-либо предложения?
— Гурурадж

133

Почему-то все ответы все излишни. Это все, что нужно:

window.location.origin

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


19
К вашему сведению, я уверен, что это будет здорово в будущем, когда все популярные браузеры внедрили его, однако в настоящее время это не так: developer.mozilla.org/en-US/docs/Web/API/… At На момент написания статьи только последние версии браузеров Firefox и WebKit поддерживают свойство origin согласно моим исследованиям.
— Зак Сет

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

5
Здравствуйте, с 2015 года. К сожалению, URLUtils все еще не реализован должным образом во всех браузерах, согласно этой таблице совместимости в MDN. Тем не менее, кажется, что свойство origin поддерживается немного лучше, чем в 2013 году, оно все еще не подходит для производства, так как не реализовано должным образом в Safari. Извините, ребята :(
— totallyNotLizards

Обновление: до сих пор не поддерживается многими браузерами (в том числе и сафари) :( :(
— Ахмад Хамза

Он также не работает в IE, он возвращает "undefined".
— Сиддхартха Чаудхури

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

Свойство protocol устанавливает или возвращает протокол текущего 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: '');

но для возможных будущих улучшений, которые могли бы вызвать конфликты, я указал ссылку "window" перед объектом "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возможно, не лучший кросс-браузер
— Натанфранке

1
Спасибо, я добавил кросс-браузерную совместимость в свой оригинальный ответ.
— JulienRioux

3
var http = location.protocol;
var slashes = http.concat("//");
var host = slashes.concat(window.location.hostname);

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

2
рассмотрите возможность объяснения вашего ответа. Не думайте, что OP может понять значение различных частей вашего кода.
— 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.