Comment extraire la partie du nom d'hôte d'une URL en JavaScript

379

Existe-t-il un moyen très simple de démarrer à partir d'une URL complète:

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

Et extrayez juste la partie hôte:

aaa.bbb.ccc.com

Il doit y avoir une fonction JavaScript qui le fait de manière fiable, mais je ne la trouve pas.

Dustin Getz
la source

Réponses:

827

supposons que vous avez une page avec cette adresse: http://sub.domain.com/virtualPath/page.htm. utilisez le code de page suivant pour obtenir ces résultats:

  • window.location.host: vous obtiendrez sub.domain.com:8080ousub.domain.com:80
  • window.location.hostname : tu auras sub.domain.com
  • window.location.protocol : tu auras http:
  • window.location.port: vous obtiendrez 8080ou80
  • window.location.pathname : tu auras /virtualPath
  • window.location.origin: vous obtiendrez http://sub.domain.com*****

Mise à jour: à propos du .origin

***** Comme l'indique la référence , la compatibilité du navigateur pour window.location.originn'est pas claire. Je l'ai vérifié en chrome et il est revenu http://sub.domain.com:portsi le port est autre que 80 et http://sub.domain.comsi le port est 80.

Un merci spécial à @torazaburo pour me l'avoir mentionné.

Amin Saqi
la source
J'ai un site Web et 2 applications dans IIS. Par exemple: sub.domain.com/v1 et sub.domain.com/v2 et des pages comme sub.domain.com/v1/Default.aspx ou sub.domain.com/v2/Products/Default.aspx , etc. Comment je peut obtenir la valeur / v2 , la racine de mon application sub.domain.com/v2 ?
Kiquenet
@Kiquenet utilise un IDE javascript comme WebStorm, vous voyez les options possibles lorsque vous écrivez du code.
Bhargav Nanekalva
3
window.location.originn'est pas défini dans IE9 (selon le lien, c'est IE11 +). Cette réponse a aidé.
Neolisk
1
Évidemment utile pour presque tout le monde, sauf qu'il ne répond pas à la question de savoir comment extraire la partie hôte de l'URL. Drôle la bonne réponse avec la fonction getRootUrl n'a que 17 contre 609 votes.
Miro
@Miro, la question est répondue n'est-ce pas, le 2ème point répond à la question: window.location.hostname: vous obtiendrez sub.domain.com
Paul
155

Vous pouvez concaténer le protocole de localisation et l'hôte:

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

Pour une URL, disons 'http://stackoverflow.com/questions', elle reviendra'http://stackoverflow.com'

CMS
la source
5
il semble que vous devriez utiliser "hostname" plutôt que "host" pour obtenir les résultats ci-dessus. source: stackoverflow.com/questions/6725890/…
user417669
Vous pouvez utiliser location.origin avec le même résultat.
Sérgio
1
La question d'origine ne demandait pas la partie protocole de l'URL.
Simon East
36

Utilisez l' document.locationobjet et ses propriétés hostou hostname.

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

La réponse acceptée n'a pas fonctionné pour moi car je voulais pouvoir travailler avec n'importe quelle URL arbitraire, pas seulement avec l'URL de la page actuelle.

Jetez un œil à l' URLobjet :

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
la source
1
Je vous remercie. Depuis des heures, je cherche une méthode pour extraire l'url que je reçois de l'API. C'était tellement simple. Je ne l'avais lu qu'en url avec une nouvelle URL. Je vous remercie.
Nodirabegimxonoyim
1
+99999999999999
ADJenks
L'une des deux réponses ici qui ne suppose pas que vous êtes du côté du navigateur ...
Will59
ne fonctionne pas sur IE11 :(
Teoman shipahi
24

Il y a deux façons. La première est une variante d'une autre réponse ici, mais celle-ci représente les ports non par défaut:

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

Mais je préfère cette méthode plus simple (qui fonctionne avec n'importe quelle chaîne URI):

function getRootUrl(url) {
  return url.toString().replace(/^(.*\/\/[^\/?#]*).*$/,"$1");
}
danorton
la source
3
Je vous remercie! J'aime mieux la 2e méthode aussi! surtout quand javascript côté serveur, pas moyen d'obtenir window.location :)
trillions
L'une des deux réponses ici qui ne suppose pas que vous êtes du côté du navigateur ... Mais vérifiez la plus récente de Martin Konecny ​​en utilisant une nouvelle URL.
Will59
6

Essayer

document.location.host

ou

document.location.hostname
Chris Nielsen
la source
3

Il y a un autre hack que j'utilise et que je n'ai jamais vu dans aucune réponse StackOverflow: l'utilisation de l'attribut "src" d'une image donnera le chemin de base complet de votre site. Par exemple :

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

Sur une URL comme http://domain.com/somesite/index.html, rootsera défini sur http://domain.com/somesite/. Cela fonctionne également pour localhost ou toute URL de base valide.

Notez que cela entraînera l'échec d'une demande HTTP sur l' $image factice. Vous pouvez utiliser une image existante à la place pour éviter cela, avec seulement de légères modifications de code.

Une autre variante utilise un lien factice, sans effet secondaire sur les requêtes HTTP:

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

Cependant, je ne l'ai pas testé sur tous les navigateurs.

kuroi neko
la source
3

Vérifiez ça:

alert(window.location.hostname);

cela renverra le nom d'hôte comme www.domain.com

et:

window.location.host

renverra le nom de domaine avec le port comme www.example.com:80

Pour une référence complète, consultez le site du développeur Mozilla .

code.rider
la source
2

Je voudrais préciser quelque chose. Si quelqu'un veut obtenir l'URL complète avec le chemin dont j'ai besoin, peut utiliser:

var fullUrl = window.location.protocol + "//" + window.location.hostname + window.location.pathname;
crx4
la source
pourquoi aller plus loin. Il peut être obtenu avec var fullUrl = window.location.origin + window.location.pathname
Anant
mais parfois vous voulez ajouter quelque chose comme un sous-domaine entre le protocole et le nom d'hôte, par exemple multilingue, etc.
crx4
2

Je sais que c'est un peu tard, mais j'ai fait une petite fonction propre avec un peu de syntaxe ES6

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

Il pourrait également être écrit dans ES5 comme

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

Bien sûr, IE ne prend pas en charge Object.assign, mais dans mon domaine de travail, cela n'a pas d'importance.

Noah Cardoza
la source
1

Regex offre beaucoup plus de flexibilité.

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