So extrahieren Sie den Hostnamen-Teil einer URL in JavaScript

379

Gibt es eine wirklich einfache Möglichkeit, von einer vollständigen URL aus zu beginnen:

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

Und extrahieren Sie nur den Host-Teil:

aaa.bbb.ccc.com

Es muss eine JavaScript-Funktion geben, die dies zuverlässig erledigt, aber ich kann sie nicht finden.

Dustin Getz
quelle

Antworten:

827

Angenommen, Sie haben eine Seite mit dieser Adresse : http://sub.domain.com/virtualPath/page.htm. Verwenden Sie den folgenden Seitencode, um diese Ergebnisse zu erzielen:

  • window.location.host: du wirst sub.domain.com:8080oder bekommensub.domain.com:80
  • window.location.hostname : Du wirst kriegen sub.domain.com
  • window.location.protocol : Du wirst kriegen http:
  • window.location.port: du wirst 8080oder bekommen80
  • window.location.pathname : Du wirst kriegen /virtualPath
  • window.location.origin: du wirst http://sub.domain.com***** bekommen

Update: über die .origin

***** Wie in der Referenz angegeben , ist die Browserkompatibilität für window.location.originnicht klar. Ich habe es in Chrom überprüft und es wurde zurückgegeben, http://sub.domain.com:portwenn der Port alles andere als 80 ist und http://sub.domain.comwenn der Port 80 ist.

Besonderer Dank geht an @torazaburo für die Erwähnung.

Amin Saqi
quelle
Ich habe eine Website und 2 Anwendungen in IIS. Beispiel: sub.domain.com/v1 und sub.domain.com/v2 und Seiten wie sub.domain.com/v1/Default.aspx oder sub.domain.com/v2/Products/Default.aspx usw. Wie ich kann value / v2 , das Stammverzeichnis für meine Anwendung sub.domain.com/v2, erhalten ?
Kiquenet
@Kiquenet Verwenden Sie eine Javascript-IDE wie WebStorm. Sie sehen mögliche Optionen, wenn Sie Code schreiben.
Bhargav Nanekalva
3
window.location.originist in IE9 undefiniert (laut Link ist es IE11 +). Diese Antwort hat geholfen.
Neolisk
1
Offensichtlich hilfreich für fast alle, außer es beantwortet nicht die Frage, wie der Host-Teil aus der URL extrahiert werden soll. Komisch, dass die richtige Antwort mit der Funktion getRootUrl nur 17 gegen 609 Stimmen hat.
Miro
@Miro die Frage wird beantwortet, nicht wahr, der 2. Aufzählungspunkt beantwortet die Frage: window.location.hostname: Sie erhalten sub.domain.com
Paul
155

Sie können das Standortprotokoll und den Host verketten:

var root = location.protocol + '//' + location.host;

Angenommen, eine URL 'http://stackoverflow.com/questions'wird zurückgegeben'http://stackoverflow.com'

CMS
quelle
5
Es scheint, als sollten Sie "Hostname" anstelle von "Host" verwenden, um die oben genannten Ergebnisse zu erzielen. Quelle: stackoverflow.com/questions/6725890/…
user417669
Sie können location.origin mit demselben Ergebnis verwenden.
Sérgio
1
In der ursprünglichen Frage wurde nicht nach dem Protokollteil der URL gefragt.
Simon East
36

Verwenden Sie das document.locationObjekt und seine hostoder hostnameEigenschaften.

alert(document.location.hostname); // alerts "stackoverflow.com"
n1313
quelle
29

Die akzeptierte Antwort hat bei mir nicht funktioniert, da ich mit beliebigen willkürlichen URLs arbeiten wollte, nicht nur mit der aktuellen Seiten-URL.

Schauen Sie sich das URLObjekt an :

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"
Martin Konecny
quelle
1
Vielen Dank. Seit Stunden habe ich nach einer Methode gesucht, um die URL zu extrahieren, die ich von der API erhalte. Es war so einfach. Ich hatte es nur in URL mit neuer URL gelesen. Vielen Dank.
Nodirabegimxonoyim
1
+99999999999999
ADJenks
Eine der beiden Antworten hier, die nicht davon ausgehen, dass Sie sich auf der Browserseite befinden ...
Will59
funktioniert nicht auf IE11 :(
Teoman shipahi
24

Es gibt zwei Möglichkeiten. Die erste ist eine Variante einer anderen Antwort hier, aber diese berücksichtigt nicht standardmäßige Ports:

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) : "");
}

Aber ich bevorzuge diese einfachere Methode (die mit jeder URI-Zeichenfolge funktioniert):

function getRootUrl(url) {
  return url.toString().replace(/^(.*\/\/[^\/?#]*).*$/,"$1");
}
Danorton
quelle
3
Vielen Dank! Ich mag die 2. Methode auch besser! Besonders wenn auf serverseitigem Javascript keine Möglichkeit besteht, window.location zu erhalten :)
Billionen
Eine der beiden Antworten hier, die nicht davon ausgehen, dass Sie sich auf der Browserseite befinden ... Überprüfen Sie jedoch die neuere von Martin Konecny ​​unter Verwendung einer neuen URL.
Will59
6

Versuchen

document.location.host

oder

document.location.hostname
Chris Nielsen
quelle
3

Es gibt einen anderen Hack, den ich verwende und der in keiner StackOverflow-Antwort gesehen wurde: Wenn Sie das Attribut "src" eines Bildes verwenden, erhalten Sie den vollständigen Basispfad Ihrer Site. Zum Beispiel :

var dummy = new Image;
dummy.src = '$';                  // using '' will fail on some browsers
var root = dummy.src.slice(0,-1); // remove trailing '$'

Auf einer URL wie http://domain.com/somesite/index.html, rootwird festgelegt werden http://domain.com/somesite/. Dies funktioniert auch für localhost oder eine gültige Basis-URL.

Beachten Sie, dass dies eine fehlgeschlagene HTTP-Anforderung auf dem Computer verursacht $ Dummy-Image verursacht. Sie können stattdessen ein vorhandenes Bild verwenden, um dies mit nur geringfügigen Codeänderungen zu vermeiden.

Eine andere Variante verwendet einen Dummy-Link ohne Nebenwirkungen auf HTTP-Anforderungen:

var dummy = document.createElement ('a');
dummy.href = '';
var root = dummy.href;

Ich habe es jedoch nicht in jedem Browser getestet.

kuroi neko
quelle
3

Überprüfen Sie dies:

alert(window.location.hostname);

Dies gibt den Hostnamen als zurück www.domain.com

und:

window.location.host

gibt den Domainnamen mit dem Port like zurück www.example.com:80

Eine vollständige Referenz finden Sie auf der Mozilla-Entwicklerseite .

code.rider
quelle
2

Ich möchte etwas spezifizieren. Wenn jemand die gesamte URL mit dem von mir benötigten Pfad erhalten möchte, kann er Folgendes verwenden:

var fullUrl = window.location.protocol + "//" + window.location.hostname + window.location.pathname;
crx4
quelle
warum länger gehen. Es kann mit var fullUrl = window.location.origin + window.location.pathname
Anant
aber manchmal möchten Sie so etwas wie eine Subdomain zwischen dem Protokoll und dem Hostnamen hinzufügen, z. B. mehrsprachig usw.
crx4
2

Ich weiß, dass dies etwas spät ist, aber ich habe eine saubere kleine Funktion mit einer kleinen ES6-Syntax erstellt

function getHost(href){
  return Object.assign(document.createElement('a'), { href }).host;
}

Es könnte auch in ES5 wie geschrieben werden

function getHost(href){
  return Object.assign(document.createElement('a'), { href: href }).host;
}

Natürlich unterstützt IE nicht Object.assign, aber in meiner Arbeit spielt das keine Rolle.

Noah Cardoza
quelle
1

Regex bietet viel mehr Flexibilität.

    //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
mvs
quelle