Obtenir le protocole, le domaine et le port depuis l'URL

301

J'ai besoin d'extraire le protocole complet, le domaine et le port d'une URL donnée. Par exemple:

https://localhost:8181/ContactUs-1.0/contact?lang=it&report_type=consumer
>>>
https://localhost:8181
yelo3
la source
9
Pour les lecteurs qui recherchent une réponse où l'URL n'est pas l'emplacement actuel, regardez ci-dessous la réponse acceptée
Guy Schalnat

Réponses:

150

obtenir d'abord l'adresse actuelle

var url = window.location.href

Ensuite, il suffit d'analyser cette chaîne

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

votre URL est:

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

J'espère que cela t'aides

wezzy
la source
8
Cela fonctionne avec la chaîne URL où l' locationobjet n'est pas disponible (js en dehors du navigateur!)
Thamme Gowda
La réponse de David Calhoun utilise l'analyseur intégré (comme location) mais peut être utilisé pour n'importe quelle URL. Vérifiez que c'est bien.
Stijn de Witt
6
Ou transformez-le simplement en une ligne:window.location.href.split('/').slice(0, 3).join('/')
Ryan McGeary
et comment vous le feriez sur le nœud?
DDD
5
window.location.origin
int soumen
576
var full = location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: '');
Shef
la source
3
@Randomblue Qu'en est-il? Vous obtiendrez about://. Cependant, je suis curieux de savoir, quel serait le cas d'utilisation about:blank? Je ne sais pas si un navigateur injecte des ressources de plugin about:blank, mais il semble que cela pourrait être le seul cas d'utilisation.
Shef
3
Cela ne fonctionne pas du tout si vous avez une chaîne URL, non? (vous devez être à location pour que cela fonctionne)
Nick T
1
Désolé pour la réponse tardive, @NickT. Oui, ça ne fait pas ça. Veuillez utiliser la belle solution fournie par David pour cela.
Shef
1
Cette réponse doit être choisie comme la bonne réponse. Il est propre et utilise l'objet de localisation standard.
Mohit Gangrade
14
Vous ne pouvez pas utiliser location.hostau lieu de location.hostname+ location.port?
c24w
180

Aucune de ces réponses ne semble répondre complètement à la question, qui appelle une URL arbitraire, pas spécifiquement l'URL de la page actuelle.

Méthode 1: utilisez l'API URL (mise en garde: pas de prise en charge IE11)

Vous pouvez utiliser l' API URL (non prise en charge par IE11, mais disponible partout ailleurs ).

Cela facilite également l'accès aux paramètres de recherche . Autre bonus: il peut être utilisé dans un Web Worker car il ne dépend pas du DOM.

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

Méthode 2 (ancienne méthode): utilisez l'analyseur intégré du navigateur dans le DOM

Utilisez-le si vous en avez besoin pour fonctionner également sur des navigateurs plus anciens.

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

C'est tout!

L'analyseur intégré du navigateur a déjà fait son travail. Maintenant, vous pouvez simplement saisir les pièces dont vous avez besoin (notez que cela fonctionne pour les deux méthodes ci-dessus):

//  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: paramètres de recherche

Il y a de fortes chances que vous souhaitiez également séparer les paramètres d'URL de recherche, car '? StartIndex = 1 & pageSize = 10' n'est pas trop utilisable en soi.

Si vous avez utilisé la méthode 1 (API URL) ci-dessus, vous utilisez simplement les getters searchParams:

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

Ou pour obtenir tous les paramètres:

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

Si vous avez utilisé la méthode 2 (à l'ancienne), vous pouvez utiliser quelque chose comme ceci:

// 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
la source
link.protocol m'obtient un "http:" si j'inspecte un anker avec "google.com" :-(var link = document.createElement('a'); link.setAttribute('href', 'google.com'); console.log(link.protocol)
eXe
Faites-vous cela sur une httppage peut-être? S'il n'est pas spécifié, il «héritera» de l'emplacement actuel
Stijn de Witt
4
Ceci est une réponse fantastique et devrait obtenir plus de votes, car cette réponse ne se limite pas à l' emplacement actuel , mais fonctionne pour n'importe quelle URL , et parce que cette réponse utilise l'analyseur intégré du navigateur au lieu d'en créer un nous-mêmes (ce que nous ne pouvons pas espérons faire aussi bien ou aussi vite!).
Stijn de Witt
Merci pour cette astuce astucieuse! Je voudrais ajouter une chose: il y a les deux hostet hostname. Le premier inclut le port (par exemple localhost:3000), tandis que le second n'est que le nom de l'hôte (par exemple localhost).
codener
Cela fonctionne bien en cas d'URL absolue. Il échoue en cas d'URL relative et de navigateur croisé. Aucune suggestion?
Gururaj
133

Pour une raison quelconque, toutes les réponses sont toutes excessives. C'est tout ce qu'il faut:

window.location.origin

Plus de détails peuvent être trouvés ici: https://developer.mozilla.org/en-US/docs/Web/API/window.location#Properties

Pijusn
la source
19
Pour votre information, je suis sûr que ce sera grand à l'avenir quand tous les navigateurs populaires ont implémenté, cependant , ce n'est pas le cas à l' heure actuelle: developer.mozilla.org/en-US/docs/Web/API/... A au moment de l'écriture, seules les versions récentes des navigateurs Firefox et WebKit prennent en charge la propriété origin selon mes recherches.
Zac Seth
2
Juste pour terminer: l'emplacement est défini sur HTML5 et il implémente l' URLUtilsinterface qui est définie sur WHATWG et inclut l' originattribut.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
5
Bonjour de 2015 .. malheureusement, URLUtils n'est toujours pas correctement implémenté dans tous les navigateurs, selon ce tableau de compatibilité sur MDN. Cependant, il semble que la propriété d'origine soit légèrement mieux prise en charge qu'en 2013, elle n'est toujours pas adaptée à la production car elle n'est pas correctement implémentée dans Safari. Désolé les gars :(
totallyNotLizards
Mise à jour: toujours pas pris en charge pour de nombreux navigateurs (safari également) :( :(
Ahmad hamza
Cela ne fonctionne pas aussi dans IE, il renvoie "non défini".
Siddhartha Chowdhury
53

Comme cela a déjà été mentionné, il n'y a pas encore de prise en charge complète, window.location.originmais au lieu de l'utiliser ou de créer une nouvelle variable à utiliser, je préfère la vérifier et si elle n'est pas définie pour la définir.

Par exemple;

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

J'ai écrit à ce sujet il y a quelques mois Un correctif pour window.location.origin

Toby
la source
1
C'est la première fois que je sais qu'il window.location.originexiste. Je vous remercie. ^^
EThaizone Jo
33

hôte

var url = window.location.host;

Retour localhost:2679

nom d'hôte

var url = window.location.hostname;

Retour localhost

Miroslav Holec
la source
Je vous remercie!!! Je ne pouvais pas comprendre pourquoi localhost était affiché au localhost/lieu de localhost:3000.
Tyler Youngblood
23

window.location.origin sera suffisant pour obtenir la même chose.

int soumen
la source
1
Cela a résolu mon problème facilement. Merci @intsoumen
Turker Tunali
14

La propriété de protocole définit ou renvoie le protocole de l'URL actuelle, y compris les deux points (:).

Cela signifie que si vous souhaitez obtenir uniquement la partie HTTP / HTTPS, vous pouvez faire quelque chose comme ceci:

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

Pour le domaine, vous pouvez utiliser:

var domain = window.location.hostname;

Pour le port, vous pouvez utiliser:

var port = window.location.port;

Gardez à l'esprit que le port sera une chaîne vide s'il n'est pas visible dans l'URL. Par exemple:

Si vous devez afficher 80/443 lorsque vous n'avez pas d'utilisation de port

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

Pourquoi ne pas utiliser:

let full = window.location.origin
Maik de Kruif
la source
3
Lorsque vous ajoutez une réponse à une question plus ancienne avec des réponses existantes, il est utile d'expliquer les nouvelles informations que votre réponse apporte et de reconnaître si le passage du temps a un impact sur la réponse.
Jason Aller
8

En effet, window.location.origin fonctionne bien dans les navigateurs suivant les normes, mais devinez quoi. IE ne suit pas les normes.

Donc à cause de cela, c'est ce qui a fonctionné pour moi dans IE, FireFox et Chrome:

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

mais pour d'éventuelles améliorations futures susceptibles de provoquer des conflits, j'ai spécifié la référence "window" avant l'objet "location".

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

Voici la solution que j'utilise:

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

ÉDITER:

Pour ajouter la compatibilité entre navigateurs, utilisez ce qui suit:

const result = `${ window.location.protocol }//${ window.location.hostname + (window.location.port ? ':' + window.location.port: '') }`;
JulienRioux
la source
1
A voté, mais window.location.hostn'est peut-être pas le meilleur navigateur
croisé
1
Merci, j'ai ajouté la compatibilité multi-navigateurs à ma réponse d'origine.
JulienRioux
3
var http = location.protocol;
var slashes = http.concat("//");
var host = slashes.concat(window.location.hostname);
Elankeeran
la source
3
var getBasePath = function(url) {
    var r = ('' + url).match(/^(https?:)?\/\/[^/]+/i);
    return r ? r[0] : '';
};
haipeng
la source
2
pensez à expliquer votre réponse. Ne présumez pas que l'OP peut comprendre la signification des différentes parties de votre code.
ADyson
3

Essayez d'utiliser une expression régulière (Regex), qui sera très utile lorsque vous souhaitez valider / extraire des éléments ou même effectuer une simple analyse en javascript.

Le regex est:

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

Manifestation:

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]

Maintenant, vous pouvez également effectuer la validation.

ed9w2in6
la source
"Un schéma d'URL RFC 3986 valide doit être composé de" une lettre et suivi de n'importe quelle combinaison de lettres, chiffres, plus ("+"), point (".") Ou tiret ("-"). "- stackoverflow. com / a / 9142331/188833 (Voici une urne: ietf: rfc: 3897 (URI) / urn: ietf: rfc: 3897 (IRI) regex pour le schéma: partie d'un URI / IRI en Python: github.com/dgerber /rfc3987/blob/master/rfc3987.py#L147 )
Wes Turner
2

Réponse simple qui fonctionne pour tous les navigateurs:

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
la source
1

Style ES6 avec paramètres configurables.

/**
 * 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
la source
0

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

Code_Worm
la source