2010-07-01 15 views
48

Quiero tener un control en mi javascript si la carga de la página está en mi máquina local.¿Cómo verificar con javascript si la conexión es un host local?

La razón por la que quiero hacer eso es que cuando desarrollo me gusta asegurarme de que mi validación del lado del servidor (C#) está funcionando correctamente. Así que me gusta ver aparecer los errores tanto del lado del cliente como del lado del servidor.

Por lo tanto, mientras estoy probando, tengo una bandera en mi jquery que valida las cosas que siempre permiten el paso de los datos no válidos. De esta forma veo los errores del lado del cliente y del servidor de una vez.

Sin embargo, ahora mismo tengo que ir y cambiar manualmente al pasar del desarrollo a la producción.

Respuesta

101

La variable location.hostname le proporciona el host actual. Esto debería ser suficiente para que usted pueda determinar qué entorno se encuentra en

if (location.hostname === "localhost" || location.hostname === "127.0.0.1") 
    alert("It's a local server!"); 
+10

no hay una solución más general/"catch-all", que también abarcaría los casos de uso de 127.0.0.1, etc.? – iX3

+8

Esto es simplemente incorrecto. muchas personas editan su archivo de host por lo que la palabra 'localhost' no se encontrará – vsync

+4

estoy de acuerdo. Esto está mal. Tampoco funcionará cuando se accede a un archivo "local" a través de una unidad de red. – ProblemsOfSumit

2

Usted puede detectar en una de su código detrás de las páginas con C#, así:.

if ((Request.Url.Host.ToLower() == "localhost")) 
{ 
    // ..., maybe set an asp:Literal value that's in the js 
} 

O si usted quiere hacer desde el script del cliente, puede verificar el valor de window.location.host.

if (window.location.host == "localhost") 
{ 
    // Do whatever 
} 

Espero que esto ayude.

+3

location.host incluye el nombre de host Y el puerto. Use location.hostname en su lugar. – pmont

0

Las respuestas anteriores sobre todo resolver el problema, pero ...

  • ¿Qué pasa si localhost no es necesariamente 'localhost /'?
  • ¿Qué sucede si desea realizar la validación de FE durante el desarrollo?
  • ¿Qué pasa si usted quiere diversas conductas durante dev
    (validación Fe, sea validación, ninguna validación)

Una solución es establecer el hash ubicación y comprobarlo.

http://myname.foo.com/form.html#devValidation

Se podría añadir opciones ilimitadas con un interruptor

switch(location.hash) {} 
    case '#devValidation': 
     // log the results and post the form 
     break; 
    case '#beValidation': 
     // skip front end validation entirely 
     break; 
    case '#noValidation': 
     // skip all validation $('[name=validationType']).val('novalidation'); 
     break; 
    case '#feValidation': 
    default: 
     // do fe validation 
     break; 
} 
+0

Esta solución todavía tiene algún trabajo manual y se puede manipular. – A1rPun

+0

Creo que el "trabajo manual" es insignificante, manipulando también, ya que podemos enviar lo que queramos sin la aprobación de JavaScript y la mayoría de los marcos tienen filtros que mitigan los ataques antes de que la solicitud llegue a la aplicación. Tal vez permitir que el OP omita la validación del lado del servidor es un riesgo, pero solo se agregó para mostrar la utilidad de usar una clave en el hash. – Shanimal

+0

Nunca uso localhost o loopback porque incluir en listas blancas docenas de clientes internacionalizados (clinetA.com, clientA.de, clientB.com, clientB.au, etc ...) se convertiría rápidamente en una pesadilla. Decidí ofrecer esta solución porque no le importa el dominio y puede verificarse en un sitio en vivo sin parche. – Shanimal

1

Una manera fácil de hacer esto sería sólo comprobar el nombre de host contra localhost o verificar el nombre de dominio personalizado contra una subcadena, en este caso URLs ".local", como http://testsite.local

var myUrlPattern = '.local'; 
if (window.location.hostname === "localhost" || location.hostname === "127.0.0.1" || window.location.hostname.indexOf(myUrlPattern) >= 0) { 
    alert("It's a local server!"); 
} 
7

si el lanzamiento de hTML estático en el navegador, por ejemplo, de ubicación como file:///C:/Documents and Settings/Administrator/Desktop/ detectando "localhost" no funcionará. location.hostname devolverá cadena vacía. así que

if (location.hostname === "localhost" || location.hostname === "127.0.0.1" || location.hostname === "") 
    alert("It's a local server!"); 
+0

Me encontré con este problema exacto y, aunque me imaginé la solución yo mismo, esta respuesta debería estar aún más arriba. – domsson

1

Todavía no es todo, pero podría ser una pequeña mejora. Ahora puede crear una matriz de dominios y utilizar .includes

const LOCAL_DOMAINS = ["localhost", "127.0.0.1", ...]; 

if (LOCAL_DOMAINS.includes(window.location.hostname)) 
    alert("It's a local server!"); 
Cuestiones relacionadas