Uzyskaj protokół, domenę i port z adresu URL


301

Muszę wyodrębnić pełny protokół, domenę i port z podanego adresu URL. Na przykład:

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

9
Dla tych czytelników, którzy szukają odpowiedzi, w której adres URL nie jest bieżącą lokalizacją, spójrz poniżej zaakceptowanej odpowiedzi
Guy Schalnat

Odpowiedzi:


150

najpierw uzyskaj aktualny adres

var url = window.location.href

Następnie po prostu przeanalizuj ten ciąg

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

twój adres URL to:

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

Mam nadzieję że to pomoże


8
Działa to z ciągiem adresu URL gdzie location obiekt nie jest dostępny (js poza przeglądarką!)
Thamme Gowda

David Calhoun's odpowiedź wykorzystuje wbudowany w parsera (jak location), ale może być stosowany do dowolnego adresu URL. Sprawdź, czy jest schludnie.
Stijn de Witt

6
Lub po prostu zmień go w jedno-liniowy:window.location.href.split('/').slice(0, 3).join('/')
Ryan McGeary

i jak zrobiłbyś to w węźle?
DDD

5
window.location.origin
int soumen

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

3
@Randomblue Co z tym? Dostaniesz about://. Jednak jestem ciekawy, do czego byłby przypadek użycia about:blank? Nie jestem pewien, czy jakakolwiek przeglądarka wstrzykuje zasoby wtyczek about:blank, ale wydaje się, że może to być jedyny przypadek użycia.
Shef

3
To nie działa wcale, jeśli masz ciąg adresu URL, prawda? (tzn. musisz być przy, location aby to zadziałało)
Nick T

1
Przepraszamy za późną odpowiedź, @NickT. Tak, nie robi tego. W tym celu skorzystaj z miłego rozwiązania dostarczonego przez Davida .
Shef,

1
Ta odpowiedź powinna zostać wybrana jako poprawna. Jest czysty i używa standardowego obiektu lokalizacji.
Mohit Gangrade,

14
Nie możesz użyć location.hostzamiast location.hostname+ location.port?
c24w

180

Żadna z tych odpowiedzi nie wydaje się w pełni uwzględniać pytania, które wymaga podania dowolnego adresu URL, a nie adresu URL bieżącej strony.

Metoda 1: Użyj interfejsu API URL (zastrzeżenie: brak obsługi IE11)

Możesz użyć interfejsu API URL (nie obsługiwany przez IE11, ale dostępny wszędzie indziej) ).

Ułatwia to także dostęp do parametrów wyszukiwania . Kolejny bonus: można go użyć w narzędziu do pracy w sieci, ponieważ nie zależy od modelu DOM.

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

Metoda 2 (stary sposób): użyj wbudowanego parsera przeglądarki w DOM

Użyj tego, jeśli potrzebujesz tego do starszych przeglądarek.

//  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');

Otóż ​​to!

Wbudowany parser przeglądarki wykonał już swoje zadanie. Teraz możesz po prostu pobrać potrzebne części (pamiętaj, że działa to w przypadku obu powyższych metod):

//  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:'

Bonus: wyszukiwanie parametrów

Prawdopodobnie zechcesz również rozdzielić parametry adresu URL wyszukiwania, ponieważ „? StartIndex = 1 i pageSize = 10” nie jest zbyt użyteczny.

Jeśli użyłeś metody 1 (URL API) powyżej, po prostu użyj gettererów getParams:

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

Lub uzyskać wszystkie parametry:

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' }

Jeśli użyłeś metody 2 (stary sposób), możesz użyć czegoś takiego:

// 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 dostaje mi „http:”, jeśli sprawdzę ankera za pomocą „google.com” :-(var link = document.createElement('a'); link.setAttribute('href', 'google.com'); console.log(link.protocol)
eXe

httpMoże robisz to na stronie? Jeśli nie zostanie określony, „odziedziczy” po bieżącej lokalizacji
Stijn de Witt

4
To fantastyczna odpowiedź i powinna uzyskać więcej głosów, ponieważ odpowiedź ta nie ogranicza się tylko do bieżącej lokalizacji, ale działa na dowolnym adresie URL , a ponieważ ta odpowiedź wykorzystuje wbudowany parser przeglądarki zamiast budowania jednego z nich (czego nie możemy mam nadzieję, że zrobię to równie dobrze lub tak szybko!).
Stijn de Witt

Dziękuję za tę sprytną sztuczkę! Chciałbym dodać jedno: jest jedno hosti drugie hostname. Pierwszy obejmuje port (np. localhost:3000), A drugi to tylko nazwa hosta (np localhost.).
koder

Działa to dobrze w przypadku bezwzględnego adresu URL. Nie działa w przypadku względnego adresu URL i przeglądarki. Jakieś sugestie?
Gururaj

132

Z jakiegoś powodu wszystkie odpowiedzi są przesadzone. To wszystko, czego potrzeba:

window.location.origin

Więcej informacji można znaleźć tutaj: https://developer.mozilla.org/en-US/docs/Web/API/window.location#Properties


19
Do Twojej wiadomości, jestem pewien, że będzie to świetne w przyszłości, gdy wszystkie popularne przeglądarki go wdrożą, jednak obecnie tak nie jest: developer.mozilla.org/en-US/docs/Web/API/… At według czasu moich badań tylko najnowsze wersje przeglądarek Firefox i WebKit obsługują właściwość origin.
Zac Seth

2
Po prostu: lokalizacja jest zdefiniowana w HTML5 i implementuje URLUtilsinterfejs zdefiniowany w WHATWG i zawiera originatrybut.
Ciro Santilli 10 冠状 病 六四 事件 法轮功

5
Witaj od 2015 roku. Niestety, URLUtils nadal nie jest poprawnie zaimplementowany we wszystkich przeglądarkach, zgodnie z tabelą kompatybilności w MDN. Wydaje się jednak, że właściwość origin jest nieco lepiej obsługiwana niż w 2013 roku, ale nadal nie nadaje się do produkcji, ponieważ nie jest poprawnie zaimplementowana w Safari. Przepraszam chłopaki :(
totallyNotLizards

Aktualizacja: Wciąż nieobsługiwana w wielu przeglądarkach (również w safari) :( :(
Ahmad hamza

Nie działa również w IE, zwraca „niezdefiniowany”.
Siddhartha Chowdhury

53

Jak już wspomniano, nie jest jeszcze w pełni obsługiwany window.location.origin ale zamiast go używać lub tworzyć nową zmienną do użycia, wolę ją sprawdzić, a jeśli nie jest ustawiona, aby ją ustawić.

Na przykład;

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

Napisałem o tym kilka miesięcy temu Poprawka dla window.location.origin


1
Po raz pierwszy wiem, że window.location.originistnieje. Dziękuję Ci. ^^
EThaizone Jo

33

gospodarz

var url = window.location.host;

zwroty localhost:2679

nazwa hosta

var url = window.location.hostname;

zwroty localhost


Dziękuję Ci!!! Nie mogłem zrozumieć, dlaczego localhost wyświetla się jako localhost/zamiast localhost:3000.
Tyler Youngblood


14

Właściwość protokołu ustawia lub zwraca protokół bieżącego adresu URL, w tym dwukropka (:).

Oznacza to, że jeśli chcesz uzyskać tylko część HTTP / HTTPS, możesz zrobić coś takiego:

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

Do domeny możesz użyć:

var domain = window.location.hostname;

Do portu możesz użyć:

var port = window.location.port;

Pamiętaj, że port będzie pustym ciągiem, jeśli nie jest widoczny w adresie URL. Na przykład:

Jeśli chcesz pokazać 80/443, gdy nie używasz portu

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

9

Dlaczego nie użyć:

let full = window.location.origin

3
Dodając odpowiedź do starszego pytania z istniejącymi odpowiedziami, warto wyjaśnić, jakie nowe informacje niesie twoja odpowiedź i stwierdzić, czy upływ czasu wpływa na odpowiedź.
Jason Aller,

8

Rzeczywiście, window.location.origin działa dobrze w przeglądarkach zgodnych ze standardami, ale zgadnij co. IE nie przestrzega standardów.

Z tego powodu działało to w IE, FireFox i Chrome:

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

ale dla możliwych przyszłych ulepszeń, które mogą powodować konflikty, podałem odniesienie do „okna” przed obiektem „lokalizacja”.

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

6

Oto rozwiązanie, którego używam:

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

EDYTOWAĆ:

Aby dodać kompatybilność z różnymi przeglądarkami, użyj:

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

1
Pozytywnie oceniany, ale window.location.hostmoże nie być najlepszy w różnych przeglądarkach
nathanfranke,

1
Dzięki, dodałem kompatybilność z różnymi przeglądarkami do mojej oryginalnej odpowiedzi.
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
rozważ wyjaśnienie swojej odpowiedzi. Nie zakładaj, że OP może zrozumieć znaczenie różnych części twojego kodu.
ADyson

3

Spróbuj użyć wyrażenia regularnego (Regex), które będzie bardzo przydatne, gdy chcesz sprawdzić / wyodrębnić rzeczy, a nawet wykonać proste parsowanie w javascript.

Wyrażenie regularne to:

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

Demonstracja:

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]

Teraz możesz także przeprowadzić weryfikację.


„Prawidłowy schemat adresów URL RFC 3986 musi składać się z„ litery, po której następuje dowolna kombinacja liter, cyfr, plus („+”), kropka („.”) Lub łącznik („-”). ”- stackoverflow. com / a / 9142331/188833 (Oto urna: ietf: rfc: 3897 (URI) / urn: ietf: rfc: 3897 (IRI) regex dla schematu: część URI / IRI w Pythonie: github.com/dgerber /rfc3987/blob/master/rfc3987.py#L147 )
Wes Turner

2

Prosta odpowiedź, która działa we wszystkich przeglądarkach:

let origin;

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

origin = window.location.origin;

1

Styl ES6 z konfigurowalnymi parametrami.

/**
 * 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
}

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.