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?


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

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.


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 :)


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


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

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.