location.host vs location.hostname y compatibilidad entre navegadores?

365

¿Cuál de estos es el más efectivo versus verificar si el agente de usuario está accediendo a través del dominio correcto?

Nos gustaría mostrar una pequeña advertencia de estilo de 'barra superior' basada en js si están accediendo al dominio utilizando algún tipo de proxy web (ya que tiende a romper el js).

Estábamos pensando en usar lo siguiente:

var r = /.*domain\.com$/;
if (r.test(location.hostname)) {
    // showMessage ...
}

Eso se encargaría de cualquier subdominio que usemos.

¿Cuál deberíamos usar host o nombre de host?

En Firefox 5 y Chrome 12:

console.log(location.host);
console.log(location.hostname);

.. muestra lo mismo para ambos.

¿Es porque el puerto no está realmente en la barra de direcciones?

W3Schools dice que el host contiene el puerto.

¿Debería validarse location.host/hostname o podemos estar bastante seguros en IE6 + y en todos los demás?

anónimo uno
fuente
66
Una cosa a tener en cuenta es que google chrome tiene un location.origin, donde MSIE y Firefox no. developer.mozilla.org/En/Window.location - msdn.microsoft.com/en-us/library/ms952653.aspx
Keyo

Respuestas:

1064

enlace interactivo anatomía

Como una pequeña nota: el enlace interactivo anatomía

-

En resumen (suponiendo una ubicación de http://example.org:8888/foo/bar#bang):

  • hostname te dio example.org
  • host te dio example.org:8888
abernier
fuente
87
Una imagen vale mas que mil palabras.
Jack Giffin
44
@lolzerywowzery ... pero solo esas mil palabras necesarias para describir la imagen
Agi Hammerthief
1
De acuerdo con en.wikipedia.org/wiki/… , el puerto no debe considerarse parte del host (pero es parte de la autoridad).
Alec
@ Alec esta es una nota técnica interesante; profundizar a través de la cita de Wikipedia revela que, de acuerdo con RFC 3986, "autoridad" debería ser el término para la concatenación del nombre de host :y el puerto. Me pregunto cuánto de la discusión todavía está disponible desde cuando location.hostse formuló ... Sospecho que se llama así hoy porque nadie presente había leído o pensado mencionar ese RFC.
JamesTheAwesomeDude
Muchas gracias por la solución simple
Tarun Nagpal
70

host solo incluye el número de puerto si hay uno especificado. Si no hay un número de puerto específicamente en la URL, entonces devuelve lo mismo que el nombre de host. Usted elige si desea coincidir con el número de puerto o no. Ver https://developer.mozilla.org/en/window.location para obtener más información.

Supongo que desea que el nombre de host solo obtenga el nombre del sitio.

jfriend00
fuente
33

Si insiste en usar el window.location.origin Puede poner esto en la parte superior de su código antes de leer elorigin

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

Solución

PD: Para el registro, en realidad era la pregunta original. Ya fue editado :)

Kenneth Palaganas
fuente
55
Pero ... OP nunca mencionó window.location.originen su pregunta. Su pregunta era en realidad específicamente con respecto a cosas que no lo son window.location.origin.
Winderps
1
También vale la pena señalar que window.location.origin tiene problemas de compatibilidad del navegador. developer.mozilla.org/en-US/docs/Web/API/Window/…
Scott
10

Su pregunta principal ha sido respondida anteriormente. Solo quería señalar que la expresión regular que estás usando tiene un error. También tendrá éxito en foo-domain.comque no es un subdominio dedomain.com

Lo que realmente quieres es esto:

/(^|\.)domain\.com$/
Bluesmoon
fuente
0

Solo para agregar una nota de que el navegador Google Chrome tiene un atributo de origen para la ubicación. que le proporciona el dominio completo desde el protocolo hasta el número de puerto como se muestra en la siguiente captura de pantalla. herramienta de desarrolladores de Chrome

Gopi P
fuente