Cómo extraer la parte del nombre de host de una URL en JavaScript

379

¿Existe una manera realmente fácil de comenzar desde una URL completa:

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

Y extraiga solo la parte del host:

aaa.bbb.ccc.com

Debe haber una función de JavaScript que haga esto de manera confiable, pero no puedo encontrarla.

Dustin Getz
fuente

Respuestas:

827

suponga que tiene una página con la siguiente dirección: http://sub.domain.com/virtualPath/page.htm. use el siguiente código de página para lograr esos resultados:

  • window.location.host: obtendrás sub.domain.com:8080osub.domain.com:80
  • window.location.hostname : usted obtendrá sub.domain.com
  • window.location.protocol : usted obtendrá http:
  • window.location.port: obtendrás 8080o80
  • window.location.pathname : usted obtendrá /virtualPath
  • window.location.origin: obtendrás http://sub.domain.com*****

Actualización: sobre el .origin

***** Como dice la referencia , la compatibilidad del navegador window.location.originno está clara. Lo revisé en Chrome y me devolvió http://sub.domain.com:portsi el puerto es cualquier cosa menos 80, y http://sub.domain.comsi el puerto es 80.

Un agradecimiento especial a @torazaburo por mencionarme eso.

Amin Saqi
fuente
Tengo un sitio web y 2 aplicaciones en IIS. P.ej: sub.domain.com/v1 y sub.domain.com/v2 y páginas como sub.domain.com/v1/Default.aspx o sub.domain.com/v2/Products/Default.aspx , etc. Cómo puede obtener valor / v2 , la raíz de mi aplicación sub.domain.com/v2 ?
Kiquenet
@Kiquenet utiliza un IDE de JavaScript como WebStorm, puede ver las posibles opciones a medida que escribe el código.
Bhargav Nanekalva
3
window.location.originno está definido en IE9 (según el enlace, es IE11 +). Esta respuesta ayudó.
Neolisco
1
Obviamente útil para casi todos, excepto que no responde la pregunta sobre cómo extraer la parte del host de la URL. Es curioso que la respuesta correcta con la función getRootUrl tenga solo 17 contra 609 votos.
Miro
@Miro, la pregunta es respondida, ¿no es así? El segundo punto responde a la pregunta: window.location.hostname: obtendrá sub.domain.com
Paul
155

Puede concatenar el protocolo de ubicación y el host:

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

Para una url, digamos 'http://stackoverflow.com/questions', volverá'http://stackoverflow.com'

CMS
fuente
55
parece que debería usar "hostname" en lugar de "host" para lograr los resultados anteriores. fuente: stackoverflow.com/questions/6725890/…
user417669
Puede usar location.origin con el mismo resultado.
Sérgio
1
La pregunta original no pedía la porción de protocolo de la URL.
Simon East
36

Usar document.locationobjeto y sus hosto hostnamepropiedades.

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

La respuesta aceptada no funcionó para mí, ya que quería poder trabajar con cualquier URL arbitraria, no solo con la URL de la página actual.

Echa un vistazo al URLobjeto :

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
fuente
1
Gracias. Durante horas, he estado buscando un método para extraer la URL que obtengo de la API. Fue muy simple. Solo lo había leído en url con una nueva URL. Gracias.
Nodirabegimxonoyim
1
+99999999999999
ADJenks
Una de las dos respuestas aquí que no asume que estás del lado del navegador ...
Will59
no funciona en IE11 :(
Teoman shipahi
24

Hay dos maneras. La primera es una variante de otra respuesta aquí, pero esta cuenta para puertos no predeterminados:

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

Pero prefiero este método más simple (que funciona con cualquier cadena de URI):

function getRootUrl(url) {
  return url.toString().replace(/^(.*\/\/[^\/?#]*).*$/,"$1");
}
Danorton
fuente
3
¡Gracias! ¡También me gusta el segundo método! especialmente cuando está en el lado del servidor javascript, no hay forma de obtener window.location :)
billones de
Una de las dos respuestas aquí que no asume que estás del lado del navegador ... Pero revisa la más reciente de Martin Konecny ​​usando una nueva URL.
Will59
6

Tratar

document.location.host

o

document.location.hostname
Chris Nielsen
fuente
3

Hay otro truco que uso y que nunca vi en ninguna respuesta de StackOverflow: el uso del atributo "src" de una imagen generará la ruta base completa de su sitio. Por ejemplo :

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

En una URL como http://domain.com/somesite/index.html, rootse establecerá en http://domain.com/somesite/. Esto también funciona para localhost o cualquier URL base válida.

Tenga en cuenta que esto provocará una solicitud HTTP fallida en la $imagen ficticia. Puede usar una imagen existente en su lugar para evitar esto, con solo pequeños cambios en el código.

Otra variante utiliza un enlace ficticio, sin efectos secundarios en las solicitudes HTTP:

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

Sin embargo, no lo probé en todos los navegadores.

kuroi neko
fuente
3

Mira esto:

alert(window.location.hostname);

esto devolverá el nombre de host como www.domain.com

y:

window.location.host

devolverá el nombre de dominio con puerto como www.example.com:80

Para una referencia completa, consulte el sitio para desarrolladores de Mozilla .

code.rider
fuente
2

Me gustaría especificar algo. Si alguien quiere obtener la URL completa con la ruta como la que necesito, puede usar:

var fullUrl = window.location.protocol + "//" + window.location.hostname + window.location.pathname;
crx4
fuente
¿Por qué ir más lejos? Se puede obtener con var fullUrl = window.location.origin + window.location.pathname
Anant
pero a veces desea agregar algo así como subdominios entre el protocolo y el nombre de host por ejemplo, en varios idiomas, etc.
crx4
2

Sé que esto es un poco tarde, pero hice una pequeña función limpia con un poco de sintaxis ES6

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

También podría escribirse en ES5 como

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

Por supuesto, IE no es compatible Object.assign, pero en mi línea de trabajo, eso no importa.

Noah Cardoza
fuente
1

Regex proporciona mucha más flexibilidad.

    //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
fuente