Получить протокол, домен и порт из URL - PullRequest
272 голосов
/ 04 августа 2011

Мне нужно извлечь полный протокол, домен и порт из заданного URL. Например:

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

Ответы [ 16 ]

525 голосов
/ 04 августа 2011
var full = location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: '');
162 голосов
/ 18 октября 2014

Похоже, что ни один из этих ответов полностью не отвечает на вопрос, который требует произвольного 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 парсер браузера в 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) выше, вы просто используете методы getParams:

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

Или для получения всех параметров:

Array
    .from(url.searchParams)
    .reduce((accum, [key, val]) => {
        accum[key] = val;
        return accum;
    }, {});
// -> { 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' }
135 голосов
/ 04 августа 2011

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

var url = window.location.href

Затем просто проанализируйте эту строку

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

Ваш URL:

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

Надеюсь, это поможет

118 голосов
/ 30 мая 2013

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

window.location.origin

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

50 голосов
/ 10 октября 2013

Как уже упоминалось, есть еще не полностью поддерживаемая 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

31 голосов
/ 19 июля 2015

хост

var url = window.location.host;

возвращает localhost:2679

имя хоста

var url = window.location.hostname;

возвращает localhost

15 голосов
/ 30 ноября 2018

window.location.origin будет достаточно, чтобы получить то же самое.

13 голосов
/ 19 марта 2014

Свойство 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');
6 голосов
/ 28 июня 2013

Действительно, 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: '');
2 голосов
/ 02 июня 2017

Попробуйте использовать регулярное выражение (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]

Теперь вы также можете выполнить проверку.

...