Rufen Sie Protokoll, Domäne und Port von der URL ab

301

Ich muss das vollständige Protokoll, die Domäne und den Port von einer bestimmten URL extrahieren. Zum Beispiel:

https://localhost:8181/ContactUs-1.0/contact?lang=it&report_type=consumer
>>>
https://localhost:8181
yelo3
quelle
9
Für diejenigen Leser, die nach einer Antwort suchen, bei der die URL nicht der aktuelle Speicherort ist, schauen Sie unter die akzeptierte Antwort
Guy Schalnat

Antworten:

150

Holen Sie sich zuerst die aktuelle Adresse

var url = window.location.href

Dann analysieren Sie einfach diese Zeichenfolge

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

Ihre URL lautet:

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

Hoffe das hilft

wezzy
quelle
8
Dies funktioniert mit URL-Zeichenfolge, wenn locationObjekt nicht verfügbar ist (js außerhalb des Browsers!)
Thamme Gowda
Die Antwort von David Calhoun verwendet den integrierten Parser (wie location), kann jedoch für jede URL verwendet werden. Schau es dir an, es ist ordentlich.
Stijn de Witt
6
Oder verwandeln Sie es einfach in einen window.location.href.split('/').slice(0, 3).join('/')
Einzeiler
und wie würden Sie dies auf dem Knoten tun?
DDD
5
window.location.origin
int soumen
576
var full = location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: '');
Shef
quelle
3
@Randomblue Was ist damit? Du wirst bekommen about://. Ich bin jedoch gespannt, wofür der Anwendungsfall wäre about:blank. Ich bin nicht sicher, ob ein Browser Plugin-Ressourcen einfügt about:blank, aber dies scheint der einzige Anwendungsfall zu sein.
Shef
3
Das funktioniert überhaupt nicht, wenn Sie eine URL-Zeichenfolge haben, oder? (dh Sie sein müssen um location für diese Arbeit)
Nick T
1
Entschuldigung für die späte Antwort, @NickT. Ja, das macht es nicht. Bitte verwenden Sie dazu die nette Lösung von David .
Shef
1
Diese Antwort sollte als die richtige Antwort gewählt werden. Es ist sauber und verwendet das Standard-Standortobjekt.
Mohit Gangrade
14
Kannst du nicht location.hostanstelle von location.hostname+ verwenden location.port?
c24w
180

Keine dieser Antworten scheint die Frage vollständig zu beantworten, die eine beliebige URL erfordert, nicht speziell die URL der aktuellen Seite.

Methode 1: Verwenden Sie die URL-API (Einschränkung: keine IE11-Unterstützung)

Sie können die URL-API verwenden (nicht von IE11 unterstützt, aber überall verfügbar ).

Dies erleichtert auch den Zugriff auf Suchparameter . Ein weiterer Bonus: Es kann in einem Web Worker verwendet werden, da es nicht vom DOM abhängt.

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

Methode 2 (alte Methode): Verwenden Sie den im DOM integrierten Parser des Browsers

Verwenden Sie diese Option, wenn Sie dies auch für ältere Browser benötigen.

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

Das ist es!

Der eingebaute Parser des Browsers hat seine Arbeit bereits erledigt. Jetzt können Sie einfach die Teile greifen, die Sie benötigen (beachten Sie, dass dies für beide oben genannten Methoden funktioniert):

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

Möglicherweise möchten Sie auch die Such-URL-Parameter aufteilen, da '? StartIndex = 1 & pageSize = 10' für sich genommen nicht allzu verwendbar ist.

Wenn Sie oben Methode 1 (URL-API) verwendet haben, verwenden Sie einfach die searchParams-Getter:

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

Oder um alle Parameter zu erhalten:

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

Wenn Sie Methode 2 (die alte Methode) verwendet haben, können Sie Folgendes verwenden:

// 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' }
David Calhoun
quelle
link.protocol gibt mir ein "http:", wenn ich einen Anker mit "google.com" inspiziere :-(var link = document.createElement('a'); link.setAttribute('href', 'google.com'); console.log(link.protocol)
eXe
Machst du das httpvielleicht auf einer Seite? Wenn nicht angegeben, wird es vom aktuellen Standort "erben"
Stijn de Witt
4
Dies ist eine fantastische Antwort und sollte mehr Stimmen erhalten, da diese Antwort nicht nur auf den aktuellen Speicherort beschränkt ist, sondern für jede URL funktioniert und weil diese Antwort den integrierten Parser des Browsers verwendet, anstatt selbst einen zu erstellen (was wir nicht können) hoffe es genauso gut oder so schnell zu machen!).
Stijn de Witt
Danke für diesen cleveren Trick! Ich möchte eines hinzufügen: Es gibt beides hostund hostname. Ersteres enthält den Port (z. B. localhost:3000), während letzteres nur der Name des Hosts ist (z localhost. B. ).
Codener
Dies funktioniert gut bei absoluter URL. Bei relativer URL und browserübergreifendem Fehler schlägt dies fehl. Irgendwelche Vorschläge?
Gururaj
133

Aus irgendeinem Grund sind alle Antworten übertrieben. Das ist alles was es braucht:

window.location.origin

Weitere Details finden Sie hier: https://developer.mozilla.org/en-US/docs/Web/API/window.location#Properties

Pijusn
quelle
19
FYI, ich bin sicher , dass dies auch in Zukunft groß sein wird , wenn alle gängigen Browser implementiert haben, jedoch ist dies nicht der Fall ist: developer.mozilla.org/en-US/docs/Web/API/... Bei Zum Zeitpunkt des Schreibens unterstützen nur neuere Versionen von Firefox- und WebKit-Browsern die Origin-Eigenschaft nach meinen Recherchen.
Zac Seth
2
Nur zum Abschluss: location ist in HTML5 definiert und implementiert die URLUtilsSchnittstelle, die in WHATWG definiert ist und das originAttribut enthält.
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功
5
Hallo aus dem Jahr 2015. Leider ist URLUtils laut dieser Kompatibilitätstabelle auf MDN immer noch nicht in allen Browsern ordnungsgemäß implementiert . Es scheint jedoch, dass die Eigenschaft origin etwas besser unterstützt wird als 2013, sie ist jedoch immer noch nicht für die Produktion geeignet, da sie in Safari nicht ordnungsgemäß implementiert ist. Sorry Leute :(
totalNotLizards
Update: Wird für viele Browser immer noch nicht unterstützt (auch Safari) :( :(
Ahmad hamza
Es funktioniert auch nicht im IE, es gibt "undefined" zurück.
Siddhartha Chowdhury
53

Wie bereits erwähnt, gibt es die noch nicht vollständig unterstützte, window.location.originaber anstatt sie entweder zu verwenden oder eine neue Variable zu erstellen, überprüfe ich sie lieber und wenn sie nicht festgelegt ist, um sie festzulegen.

Beispielsweise;

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

Ich habe tatsächlich vor ein paar Monaten darüber geschrieben. Ein Fix für window.location.origin

Toby
quelle
1
Dies ist das erste Mal, dass ich weiß, dass window.location.origines existiert. Danke dir. ^^
EThaizone Jo
33

Wirt

var url = window.location.host;

kehrt zurück localhost:2679

Hostname

var url = window.location.hostname;

kehrt zurück localhost

Miroslav Holec
quelle
Danke dir!!! Ich konnte nicht herausfinden, warum localhost als localhost/statt angezeigt wurde localhost:3000.
Tyler Youngblood
23

window.location.origin wird ausreichen, um das gleiche zu bekommen.

int soumen
quelle
1
Das hat mein Problem leicht gelöst. Vielen Dank, dass Sie @intsoumen
Turker Tunali
14

Die Protokolleigenschaft legt das Protokoll der aktuellen URL fest oder gibt es zurück, einschließlich des Doppelpunkts (:).

Dies bedeutet, dass Sie Folgendes tun können, wenn Sie nur den HTTP / HTTPS-Teil erhalten möchten:

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

Für die Domain können Sie verwenden:

var domain = window.location.hostname;

Für den Port können Sie verwenden:

var port = window.location.port;

Beachten Sie, dass der Port eine leere Zeichenfolge ist, wenn er in der URL nicht sichtbar ist. Zum Beispiel:

Wenn Sie 80/443 anzeigen müssen, wenn Sie keinen Port verwenden

var port = window.location.port || (protocol === 'https' ? '443' : '80');
Дамян Станчев
quelle
9

Warum nicht verwenden:

let full = window.location.origin
Maik de Kruif
quelle
3
Wenn Sie einer älteren Frage eine Antwort mit vorhandenen Antworten hinzufügen, ist es hilfreich zu erklären, welche neuen Informationen Ihre Antwort bringt, und zu bestätigen, ob sich der Zeitablauf auf die Antwort auswirkt.
Jason Aller
8

In der Tat funktioniert window.location.origin in Browsern nach Standards einwandfrei , aber raten Sie mal. IE folgt nicht den Standards.

Aus diesem Grund hat dies in IE, FireFox und Chrome für mich funktioniert:

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

Für mögliche zukünftige Verbesserungen, die Konflikte verursachen könnten, habe ich die Referenz "Fenster" vor dem Objekt "Standort" angegeben.

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

Hier ist die Lösung, die ich verwende:

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

BEARBEITEN:

Verwenden Sie Folgendes, um die browserübergreifende Kompatibilität zu erhöhen:

const result = `${ window.location.protocol }//${ window.location.hostname + (window.location.port ? ':' + window.location.port: '') }`;
JulienRioux
quelle
1
Upvoted, aber window.location.hostmöglicherweise nicht der beste Cross-Browser
Nathanfranke
1
Vielen Dank, ich habe meiner ursprünglichen Antwort die Cross-Browser-Kompatibilität hinzugefügt.
JulienRioux
3
var http = location.protocol;
var slashes = http.concat("//");
var host = slashes.concat(window.location.hostname);
Elankeeran
quelle
3
var getBasePath = function(url) {
    var r = ('' + url).match(/^(https?:)?\/\/[^/]+/i);
    return r ? r[0] : '';
};
haipeng
quelle
2
Erwägen Sie, Ihre Antwort zu erklären. Gehen Sie nicht davon aus, dass das OP die Bedeutung der verschiedenen Teile Ihres Codes verstehen kann.
ADyson
3

Verwenden Sie einen regulären Ausdruck (Regex), der sehr nützlich ist, wenn Sie Inhalte validieren / extrahieren oder sogar eine einfache Analyse in Javascript durchführen möchten.

Der reguläre Ausdruck ist:

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

Demonstration:

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]

Jetzt können Sie auch eine Validierung durchführen.

ed9w2in6
quelle
"Ein gültiges RFC 3986-URL-Schema muss aus einem Buchstaben bestehen, gefolgt von einer beliebigen Kombination aus Buchstaben, Ziffern, Pluszeichen (" + "), Punkt (". ") Oder Bindestrich (" - ")." - Stapelüberlauf. com / a / 9142331/188833 (Hier ist eine Urne: ietf: rfc: 3897 (URI) / Urne: ietf: rfc: 3897 (IRI) Regex für das Schema: Teil einer URI / IRI in Python: github.com/dgerber /rfc3987/blob/master/rfc3987.py#L147 )
Wes Turner
2

Einfache Antwort, die für alle Browser funktioniert:

let origin;

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

origin = window.location.origin;
Mike Hawes
quelle
1

ES6-Stil mit konfigurierbaren Parametern.

/**
 * 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
}
Sébastien
quelle
0

window.location.protocol + '//' + window.location.host

Code_Worm
quelle