Ottieni protocollo, dominio e porta dall'URL


301

Devo estrarre il protocollo, il dominio e la porta completi da un determinato URL. Per esempio:

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

9
Per quei lettori che cercano una risposta in cui l'URL non è la posizione corrente, guarda sotto la risposta accettata
Guy Schalnat,

Risposte:


150

prima ottenere l'indirizzo attuale

var url = window.location.href

Quindi analizza quella stringa

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

il tuo indirizzo è:

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

Spero che questo ti aiuti


8
Funziona con una stringa URL in cui l' locationoggetto non è disponibile (js fuori dal browser!)
Thamme Gowda,

La risposta di David Calhoun utilizza il parser incorporato (simile location) ma può essere utilizzato per qualsiasi URL. Dai un'occhiata è pulito.
Stijn de Witt,

6
O semplicemente trasformalo in una riga:window.location.href.split('/').slice(0, 3).join('/')
Ryan McGeary,

e come lo faresti sul nodo?
DDD,

5
window.location.origin
int soumen

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

3
@Randomblue Che ne pensi? Otterrai about://. Tuttavia, sono curioso di sapere, a che cosa servirà about:blank? Non sono sicuro se un browser inietti risorse del plug-in about:blank, ma sembra che potrebbe essere l'unico caso d'uso.
Shef

3
Questo non funziona affatto se hai una stringa URL, giusto? (cioè è necessario essere in location per questo al lavoro)
Nick T

1
Ci scusiamo per la risposta tardiva, @NickT. Sì, non lo fa. Per favore, usa la bella soluzione fornita da David per questo.
Shef,

1
Questa risposta dovrebbe essere scelta come risposta corretta. È pulito e utilizza l'oggetto posizione standard.
Mohit Gangrade,

14
Non puoi usare location.hostinvece di location.hostname+ location.port?
c24w,

180

Nessuna di queste risposte sembra rispondere completamente alla domanda, che richiede un URL arbitrario, non specificamente l'URL della pagina corrente.

Metodo 1: utilizzare l'API URL (avvertenza: nessun supporto IE11)

Puoi utilizzare l' API URL (non supportata da IE11, ma disponibile ovunque ).

Ciò semplifica anche l'accesso ai parametri di ricerca . Un altro vantaggio: può essere utilizzato in un Web Worker poiché non dipende dal DOM.

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

Metodo 2 (vecchio modo): utilizzare il parser integrato nel browser nel DOM

Usa questo se ne hai bisogno per funzionare anche su browser meno recenti.

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

Questo è tutto!

Il parser integrato nel browser ha già fatto il suo lavoro. Ora puoi semplicemente prendere le parti di cui hai bisogno (nota che funziona per entrambi i metodi sopra):

//  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: ricerca parametri

È probabile che probabilmente vorrai spezzare anche i parametri dell'URL di ricerca, poiché '? StartIndex = 1 & pageSize = 10' non è troppo utilizzabile da solo.

Se hai usato il Metodo 1 (API URL) sopra, devi semplicemente usare i getter searchParams:

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

O per ottenere tutti i parametri:

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

Se hai usato il Metodo 2 (alla vecchia maniera), puoi usare qualcosa del genere:

// 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 mi dà un "http:" se controllo un anker con "google.com" :-(var link = document.createElement('a'); link.setAttribute('href', 'google.com'); console.log(link.protocol)
eXe

Lo stai facendo su una httppagina forse? Se non specificato, verrà ereditato dalla posizione corrente
Stijn de Witt,

4
Questa è una risposta fantastica e dovrebbe ottenere più voti, perché questa risposta non si limita solo alla posizione corrente ma funziona per qualsiasi url e perché questa risposta utilizza il parser integrato nel browser invece di crearne uno noi stessi (cosa che non possiamo spero di fare altrettanto o più velocemente!).
Stijn de Witt,

Grazie per questo trucco intelligente! Vorrei aggiungere una cosa: c'è sia hoste hostname. Il primo include la porta (ad es. localhost:3000), Mentre il secondo è solo il nome dell'host (ad es localhost.).
programmatore

Funziona bene in caso di URL assoluto. Non funziona in caso di URL relativo e browser incrociati. Eventuali suggerimenti?
Gururaj,

133

Per qualche motivo tutte le risposte sono tutte eccessive. Questo è tutto ciò che serve:

window.location.origin

Maggiori dettagli sono disponibili qui: https://developer.mozilla.org/en-US/docs/Web/API/window.location#Properties


19
Cordiali saluti, sono sicuro che questo sarà grande in futuro, quando tutti i browser più diffusi hanno messo in atto è, tuttavia , questo non è il caso oggi: developer.mozilla.org/en-US/docs/Web/API/... A il momento in cui scrivo solo le versioni recenti dei browser Firefox e WebKit supportano la proprietà origin secondo la mia ricerca.
Zac Seth,

2
Solo per completare: la posizione è definita su HTML5 e implementa l' URLUtilsinterfaccia definita su WHATWG e include l' originattributo.
Ciro Santilli 10 冠状 病 六四 事件 法轮功

5
Ciao dal 2015 .. purtroppo URLUtils non è ancora implementato correttamente su tutti i browser, secondo questa tabella di compatibilità su MDN. Tuttavia sembra che la proprietà origin sia leggermente meglio supportata rispetto al 2013, non è ancora adatta alla produzione in quanto non è implementata correttamente in Safari. Scusate ragazzi :(
totallyNotLizards il

Aggiornamento: ancora non supportato per molti browser (anche Safari) :( :(
Ahmad hamza,

Non funziona anche in IE, restituisce "non definito".
Siddhartha Chowdhury,

53

Come già accennato, non esiste ancora il supporto completo, window.location.originma invece di usarlo o creare una nuova variabile da usare, preferisco controllarlo e se non è impostato per impostarlo.

Per esempio;

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

In realtà ne ho scritto qualche mese fa Una correzione per window.location.origin


1
Questa è la prima volta che so che window.location.originesiste. Grazie. ^^
EThaizone Jo

33

ospite

var url = window.location.host;

ritorna localhost:2679

Nome host

var url = window.location.hostname;

ritorna localhost


Grazie!!! Non riuscivo a capire perché localhost fosse mostrato al localhost/posto di localhost:3000.
Tyler Youngblood,

23

window.location.origin sarà abbastanza per ottenere lo stesso.


1
Ciò ha risolto facilmente il mio problema. Grazie @intsoumen
Turker Tunali

14

La proprietà protocol imposta o restituisce il protocollo dell'URL corrente, inclusi i due punti (:).

Questo significa che se vuoi ottenere solo la parte HTTP / HTTPS puoi fare qualcosa del genere:

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

Per il dominio puoi usare:

var domain = window.location.hostname;

Per la porta puoi usare:

var port = window.location.port;

Tieni presente che la porta sarà una stringa vuota se non è visibile nell'URL. Per esempio:

Se è necessario mostrare 80/443 quando non si dispone della porta

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

9

Perché non usare:

let full = window.location.origin

3
Quando aggiungi una risposta a una domanda precedente con risposte esistenti, è utile spiegare quali nuove informazioni porta la tua risposta e riconoscere se il passare del tempo influisce sulla risposta.
Jason Aller il

8

In effetti, window.location.origin funziona bene nei browser seguendo gli standard, ma indovina un po '. IE non segue gli standard.

Quindi a causa di ciò, questo è ciò che ha funzionato per me in IE, FireFox e Chrome:

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

ma per possibili miglioramenti futuri che potrebbero causare conflitti, ho specificato il riferimento "finestra" prima dell'oggetto "posizione".

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

6

Ecco la soluzione che sto usando:

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

MODIFICARE:

Per aggiungere la compatibilità tra browser, utilizzare quanto segue:

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

1
Eseguito l'upgrade, ma window.location.hostpotrebbe non essere il miglior cross-browser
nathanfranke il

1
Grazie, ho aggiunto la compatibilità tra browser alla mia risposta originale.
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
considera di spiegare la tua risposta. Non dare per scontato che l'OP possa comprendere il significato delle diverse parti del codice.
ADyson

3

Prova a usare un'espressione regolare (Regex), che sarà molto utile quando vuoi convalidare / estrarre cose o anche fare qualche semplice analisi in javascript.

Il regex è:

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

Dimostrazione:

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]

Ora puoi anche fare la validazione.


"Uno schema URL RFC 3986 valido deve essere costituito da" una lettera e seguita da qualsiasi combinazione di lettere, cifre, più ("+"), punto (".") O trattino ("-"). "- stackoverflow. com / a / 9142331/188833 (Ecco un'urna: ietf: rfc: 3897 (URI) / urna: ietf: rfc: 3897 (IRI) regex per lo schema: parte di un URI / IRI in Python: github.com/dgerber /rfc3987/blob/master/rfc3987.py#L147 )
Wes Turner,

2

Risposta semplice che funziona per tutti i browser:

let origin;

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

origin = window.location.origin;

1

Stile ES6 con parametri configurabili.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.