Come verificare con javascript se la connessione è un host locale?


99

Voglio avere un controllo nel mio javascript se la pagina che si sta caricando è sul mio computer locale.

Il motivo per cui voglio farlo è che quando sviluppo mi piace assicurarmi che la convalida lato server (C #) funzioni correttamente. Quindi mi piace vedere gli errori lato client e lato server da mostrare.

Quindi mentre sto testando ho un flag nel mio jquery validate roba che lascia sempre passare i dati non validi. In questo modo vedo il lato client e gli errori del server in una volta sola.

Tuttavia in questo momento devo andare manualmente e cambiare avanti e indietro quando passo dallo sviluppo alla produzione.


3
Vorrei solo avvertire chiunque utilizzi uno di questi metodi in una qualsiasi di queste risposte di "aggiungere" funzionalità al sistema, soprattutto se tale funzionalità potrebbe essere utilizzata per esporre informazioni o dati altrimenti protetti nel sistema. Tuttavia, è opportuno utilizzare questa tecnica per "rimuovere" la funzionalità. Ad esempio, se desideri sopprimere l'attivazione del monitoraggio delle analisi nel tuo ambiente di sviluppo, anche se lo fai nel tuo ambiente di produzione. Pensa attentamente a ciò che stai esponendo attraverso un condizionale lato browser o un interruttore e come potrebbe diventare una vulnerabilità di sicurezza.
Javid Jamae

Risposte:


205

La location.hostnamevariabile ti fornisce l'host corrente. Questo dovrebbe essere sufficiente per determinare in quale ambiente ti trovi.

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

14
Non esiste una soluzione più generale / "catch-all" che copra anche casi di utilizzo di 127.0.0.1, ecc.?
jacobq

8
Questo è semplicemente sbagliato. molte persone modificano il loro file host in modo che la parola "localhost" non venga trovata
vsync

4
sono d'accordo. Questo è sbagliato. Inoltre non funzionerà quando si accede a un file "locale" tramite un'unità di rete.
ProblemsOfSumit

1
@Sumit attraverso l'interfaccia del file puoi controllare che il nome host sia vuoto
chacham15

1
Uhh, non sono sicuro del motivo per cui tutti lo affermano come sbagliato. Questo semplice frammento funziona perfettamente per me su localhost e produzione. Il mio software conosce il tempo per pubblicare annunci o no, con 1 semplice riga di codice. Grazie OP.
Andy

30

se si avvia un html statico nel browser, ad esempio da una posizione come la file:///C:/Documents and Settings/Administrator/Desktop/rilevazione di "localhost", non funzionerà. location.hostnamerestituirà una stringa vuota. così

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

Mi sono imbattuto in questo problema esatto e mentre ho capito la soluzione da solo, questa risposta dovrebbe essere ancora più in alto.
domsson

6

Non è ancora un problema, ma potrebbe essere un piccolo miglioramento. È ora possibile creare un array di domini e utilizzare .includes

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

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

3

È così che viene controllato in React, registra il lavoratore del servizio , buon modo per verificare se sei su localhost controllando il nome host, inclusi localhost e IPv6 , e la corrispondenza inizia con 127 :

const isLocalhost = Boolean(
    window.location.hostname === 'localhost' ||
    // [::1] is the IPv6 localhost address.
    window.location.hostname === '[::1]' ||
    // 127.0.0.1/8 is considered localhost for IPv4.
    window.location.hostname.match(
        /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
    )
);

2

Un modo semplice per farlo sarebbe semplicemente controllare il nome host con localhost o controllare il tuo nome di dominio personalizzato con una sottostringa, in questo caso gli URL ".local", come 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!");
}

2

Forma più breve che utilizza la stessa meccanica degli altri script:

if ( ["localhost", "127.0.0.1", ""].includes(window.location.hostname) ) {
     console.log("It's local host !");
}

2

Questo riguarda anche alcuni casi comuni in cui gli IP della rete locale iniziano con 10.0.o 192.168.o Bonjour come dominio che termina il .local:

export function isLocalNetwork(hostname = window.location.hostname) {
  return (
    (['localhost', '127.0.0.1', '', '::1'].includes(hostname))
    || (hostname.startsWith('192.168.'))
    || (hostname.startsWith('10.0.'))
    || (hostname.endsWith('.local'))
  )
}

1

È possibile rilevare in uno dei codici dietro le pagine con c #, in questo modo:

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

Oppure, se vuoi farlo dallo script del client, puoi controllare il valore di window.location.host.

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

Spero che questo ti aiuti.


3
location.host include il nome host E la porta. Usa invece location.hostname.
pmont

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

/* offline || development */
if ( LOCAL_DOMAINS.includes(location.hostname) )
{
    BASE_URL_PUBLIC = location.hostname + "/folder/website/"; // your project folder
}

/* online || production */
else
{
    BASE_URL_PUBLIC = location.hostname;
}

0

Le risposte di cui sopra risolvono principalmente il problema ma ...

  • Cosa succede se localhost non è necessariamente "localhost /"?
  • E se volessi eseguire la convalida FE durante lo sviluppo?
  • Cosa succede se vuoi comportamenti diversi durante lo sviluppo
    ( fe validation, be validation, no validation )

Una soluzione è impostare l'hash della posizione e controllarlo.

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

Puoi aggiungere opzioni illimitate con un interruttore

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;
}

Questa soluzione ha ancora del lavoro manuale e può essere manomessa.
A1rPun

Penso che il "lavoro manuale" sia insignificante, anche manomissione poiché possiamo inviare tutto ciò che ci piace senza l'approvazione di javascript e la maggior parte dei framework ha filtri che mitigano gli attacchi prima che la richiesta raggiunga l'applicazione. Forse consentire all'OP di saltare la convalida lato server è un rischio, ma è stato aggiunto solo per mostrare l'utilità di utilizzare una chiave nell'hash.
Shanimal

Non uso mai localhost o loopback perché inserire nella whitelist dozzine di client internazionalizzati (clinetA.com, clientA.de, clientB.com, clientB.au, ecc ...) diventerebbe rapidamente un incubo. Ho deciso di offrire questa soluzione perché non si preoccupa del dominio e può essere controllata in un sito live senza una patch.
Shanimal

0

L'espressione regolare è più lenta *, ma breve e precisa. Inoltre, nessuno qui controlla l'host locale IPv6 (:: 1)

/localhost|127\.0\.0\.1|::1|\.local|^$/i.test(location.hostname)

Controlla l'host locale generale, il dominio .local e il file: (nome host vuoto).

*) In Chrome, le prestazioni di [].includes(...)sono le migliori (42 ms), seguite da loop semplice (for, while) con controllo degli elementi dell'array (119 ms), quindi [].indexOf(...) > -1(289 ms) e infine regexp (566 ms). Ma queste misurazioni sono in qualche modo relative, perché diversi browser sono ottimizzati in modo diverso. In FF 52 ESR includese indexOfhanno risultati simili, regexp è 2 volte più lento e loop 6 volte più lento.


0

Sulla base dei commenti precedenti, la seguente espressione regolare mi ha aiutato a verificare se l'URL è "localhost", qualsiasi indirizzo IP IPv4 o IPv6.

window.location.hostname.match(/localhost|[0-9]{2,3}\.[0-9]{2,3}\.[0-9]{2,3}\.[0-9]{2,3}|::1|\.local|^$/gi)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.