Obtenga el nombre de dominio actual con Javascript (no la ruta, etc.)


246

Planeo comprar dos nombres de dominio para el mismo sitio. Dependiendo de qué dominio se use, planeo proporcionar datos ligeramente diferentes en la página. ¿Hay alguna forma de detectar el nombre de dominio real desde el que se carga la página para saber a qué cambiar mi contenido?

He buscado cosas como esta, pero la mayoría no funciona como yo quiero.

Por ejemplo cuando se usa

document.write(document.location)

en JSFiddle vuelve

http://fiddle.jshell.net/_display/

es decir, el camino real o lo que sea.


1
No estoy seguro si entiendo exactamente lo que quieres hacer, pero probablemente deberías echar un vistazo a MDN con respecto a esto
MilkyWayJoe

Un poco de tema, pero también podría considerar tener subdominios en lugar de dos nombres de dominio separados. Algo así premium.random.comyfree.random.com
T.Chmelevskij

Respuestas:


456

Qué tal si:

window.location.hostname

El locationobjeto en realidad tiene una serie de atributos que se refieren a diferentes partes de la URL


55
y window.location.hostnamesi no quieres obtener el port(como http://localhost:3000/, window.location.host = 'localhost:3000'ywindow.location.hostname = 'localhost'
Guilherme

66
La respuesta es incorrecta porque el puerto no pertenece al dominio. Y window.location.hosta veces devolverá el puerto.
Andrej

44
Esto también devuelve el nombre del servidor ('www.amazingjokes.com', en lugar de solo '.amazingjokes.com')
patrick

En caso de que haya reenviado DNS, es posible que necesite este - window.location.ancestorOrigins
Kirill Gusyatin

128

Intente ejecutar en script: ruta: http: // localhost: 4200 / landing? Query = 1 # 2

console.log(window.location.hash)

La ubicación tiene los siguientes valores:

window.location.hash: "#2"

window.location.host: "localhost:4200"

window.location.hostname: "localhost"

window.location.href: "http://localhost:4200/landing?query=1#2"

window.location.origin: "http://localhost:4200"

window.location.pathname: "/landing"

window.location.port: "4200"

window.location.protocol: "http:"

window.location.search: "?query=1"

3
Esta es una gran respuesta!
Andrew Campbell

2
Me encantan las respuestas con varios ejemplos. Muchas muchas gracias.
Magno Alberto

24

Si no está interesado en el nombre de host (por ejemplo www.beta.example.com) pero en el nombre de dominio (por ejemplo example.com), esto funciona para nombres de host válidos:

function getDomainName(hostName)
{
    return hostName.substring(hostName.lastIndexOf(".", hostName.lastIndexOf(".") - 1) + 1);
}

13
Incorrecto, esto se romperá en casi todos los TLD internacionales.
tbranyen

44
@tbranyen, ¿puedes explicar a qué te refieres? El único caso en el que puedo pensar son los subdominios como amazon.co.uk. Pero definitivamente no "casi todos los TLD internacionales". De hecho, funciona con el 100% de los códigos de país que se encuentran en Wikipedia
cprcrack

1
cprcrack por alguna razón pensé que los tlds más internacionales (para América) contenían múltiples puntos. Gracias por corregir!
tbranyen

Varios países trabajan de manera similar al Reino Unido: tienen dominios fijos de segundo nivel y solo puede registrar dominios en el tercer nivel. Una lista de esos países está en Wikipedia .
Gareth

18
function getDomain(url, subdomain) {
    subdomain = subdomain || false;

    url = url.replace(/(https?:\/\/)?(www.)?/i, '');

    if (!subdomain) {
        url = url.split('.');

        url = url.slice(url.length - 2).join('.');
    }

    if (url.indexOf('/') !== -1) {
        return url.split('/')[0];
    }

    return url;
}

Ejemplos

La versión anterior estaba obteniendo el dominio completo (incluido el subdominio). Ahora determina el dominio correcto según la preferencia. De modo que cuando se proporciona un segundo argumento como verdadero, incluirá el subdominio; de lo contrario, solo devolverá el 'dominio principal'


1
Esta debería ser la respuesta, funciona incluso localhost/test.phpy esa es la respuesta correcta localhost.
Mohammad AlBanna

También es la mejor respuesta porque funciona con cualquier URL que
ingrese

Si haces esto google.co.ukpara, obtendrás 'co.uk', lo cual no es correcto ...
James Douglas

Si. Ese es un negocio complicado. Incluso más complicado si tienes subdominios también (como: test.google.co.uk). Si desea utilizar esta versión sin procesar, se necesitan algunos ajustes serios (tal vez incluso agregar una lista especial para esos tlds).
adelineu

10

Puede obtenerlo fácilmente desde el objeto de ubicación en Javascript:

Por ejemplo, la URL de esta página es:

http://www.stackoverflow.com/questions/11401897/get-the-current-domain-name-with-javascript-not-the-path-etc

Entonces podemos obtener el dominio exacto con las siguientes propiedades del objeto de ubicación:

location.host = "www.stackoverflow.com"
location.protocol= "http:"

puedes hacer el dominio completo con:

location.protocol + "//" + location.host

Que en este ejemplo devuelve http://www.stackoverflow.com

Además de esto, podemos obtener la URL completa y también la ruta con otras propiedades del objeto de ubicación:

location.href= "http://www.stackoverflow.com/questions/11401897/get-the-current-domain-name-with-javascript-not-the-path-etc"    
location.pathname= "questions/11401897/get-the-current-domain-name-with-javascript-not-the-path-etc"

7

Si solo está interesado en el nombre de dominio y desea ignorar el subdominio, debe analizarlo hostyhostname .

El siguiente código hace esto:

var firstDot = window.location.hostname.indexOf('.');
var tld = ".net";
var isSubdomain = firstDot < window.location.hostname.indexOf(tld);
var domain;

if (isSubdomain) {
    domain = window.location.hostname.substring(firstDot == -1 ? 0 : firstDot + 1);
}
else {
  domain = window.location.hostname;
}

http://jsfiddle.net/5U366/4/


¿Por qué devuelve jShell en lugar de jsFiddle?
Freesnöw

2
@XanderLamkins: es un iframe: jsfiddle.net/5U366 <-> fiddle.jshell.net/5U366/show
Saxoier

7

Como esta pregunta solicita el nombre de dominio, no el nombre de host, se debe responder correctamente

window.location.hostname.split('.').slice(-2).join('.')

Esto también funciona para nombres de host como www.example.com .


1
Esto funciona pero no funciona con dominios como domain.co.uk, domain.com.br .. ¿Cómo puedo hacer que funcione con cualquier dominio?
Sameh

6

Utilizar

document.write(document.location.hostname)​

window.locationTiene un montón de propiedades. Vea aquí para obtener una lista de ellos.


5

Si desea un origen de dominio completo, puede usar esto:

document.location.origin

Y si desea obtener solo el dominio, use puede simplemente esto:

document.location.hostname

Pero tiene otras opciones, eche un vistazo a las propiedades en:

document.location

5

¿Qué hay de esta función?

window.location.hostname.match(/\w*\.\w*$/gi)[0]

Esto coincidirá solo con el nombre de dominio, independientemente de si es un subdominio o un dominio principal


1
Me gusta esta respuesta Pero debe tener en cuenta que si lo usa para fines relacionados con la seguridad ... puede omitirse. Es decir, si quiere asegurarse de estar en example.com, entonces hacker-example.com también sería igual a 'example.com'. window.location.hostname.match (/ [a-zA-Z0-9 -] * \. [a-zA-Z0-9 -] * $ /) [0] funciona.
hiburn8

4

Si desea obtener el nombre de dominio en JavaScript, simplemente use el siguiente código:

var domain_name = document.location.hostname;
alert(domain_name);

Si necesita la ruta URL de la página web para poder acceder a la ruta URL de la web, use este ejemplo:

var url = document.URL;
alert(url);


1

Soy nuevo en JavaScript, pero ¿no puedes usar: document.domain ?

Ejemplo:

<p id="ourdomain"></p>

<script>
var domainstring = document.domain;
document.getElementById("ourdomain").innerHTML = (domainstring);
</script>

Salida:

domain.com

o

www.domain.com

Dependiendo de lo que use en su sitio web.


0

Me imagino que debería ser tan simple como esto:

url.split("/")[2]


Funciona para mi. Las soluciones anteriores se basan en documento, ubicación u objeto de ventana.
Cris

0

Combinando algunas respuestas de lo anterior, lo siguiente funciona muy bien para mí para destruir Cookies:

  /**
   * Utility method to obtain the domain URI:
   */
  fetchDomainURI() {
    if (window.location.port.length > 0) {
      return window.location.hostname;
    }
    return `.${window.location.hostname.match(/\w*\.\w*$/gi)[0]}`;
  }

Obras para las direcciones IP con puertos, por ejemplo, 0.0.0.0:8000 etc, así como dominios complejos como app.staging.example.comregresar .example.com=> permite la configuración de varios dominios de la galleta y la destrucción.


0

Si desea el nombre de dominio del país, por ejemplo, extraer  .com   de stackoverflow.com:

(ES6):

const getCountryDomainName = () => {
  let hostName = window.location.hostname;
  let lastDotIndex = hostName.lastIndexOf('.');
  let countryDomainName = hostName.substr(lastDotIndex+1, hostName.length);
  return countryDomainName;
}

(ES5):

function getCountryDomainName() {
  let hostName = window.location.hostname;
  let lastDotIndex = hostName.lastIndexOf('.');
  let countryDomainName = hostName.substr(lastDotIndex+1, hostName.length);
  return countryDomainName;
}

Luego, solo use la función para asignar el valor a una var:

const countryDomainName = getCountryDomainName();

-2
       Feel free to visit our “<a href="javascript:document.location.href=document.location.origin+'/contact-us'" title="Click to Contact Us" class="coded_link" ><span class="ui-icon ui-icon-newwin"></span>Contact</a>” link

De hecho funcionó para mí, mientras que no podía usar PHP

Solo probé que funcionó gracias al enfoque mencionado anteriormente en algunas de las respuestas, tan rápido y verificado que funcionó


@Brandito Gracias, bueno, ese sitio estaba alojado en un host virtual de AWS, creo que usando WordPress y no sé por qué estaba dando problemas para hacerlo de esa manera ... No estoy seguro de si fue una redirección incorrecta o algo que tenía que hacer con las reglas de reescritura del mod de backend. Además, quería usar una herramienta e icono con el tema jquery ui junto con él. Aprobado por el cliente en primer lugar, por supuesto: '-)
Jean Paul AKA el_vete
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.