Wie überprüfe ich mit Javascript, ob die Verbindung ein lokaler Host ist?

97

Ich möchte in meinem Javascript überprüfen, ob sich die geladene Seite auf meinem lokalen Computer befindet.

Der Grund, warum ich das tun möchte, ist, dass ich bei der Entwicklung sicherstellen möchte, dass meine serverseitige (C #) Validierung ordnungsgemäß funktioniert. Daher möchte ich sehen, dass sowohl clientseitige als auch serverseitige Fehler angezeigt werden.

Während ich teste, habe ich ein Flag in meinem jquery-Validierungsmaterial, das nur immer ungültige Daten durchlässt. Auf diese Weise sehe ich die clientseitigen und Serverfehler auf einmal.

Im Moment muss ich jedoch manuell hin und her wechseln, wenn ich von der Entwicklung zur Produktion gehe.

chobo2
quelle
3
Ich würde nur jeden warnen, der eine dieser Methoden in einer dieser Antworten verwendet, um dem System Funktionen hinzuzufügen, insbesondere wenn diese Funktionen verwendet werden könnten, um ansonsten sichere Informationen oder Daten in Ihrem System verfügbar zu machen. Die Verwendung dieser Technik zum "Entfernen" von Funktionen ist jedoch sinnvoll. Zum Beispiel, wenn Sie das Tracking von Auslöseanalysen in Ihrer Entwicklungsumgebung unterdrücken möchten, obwohl Sie dies in Ihrer Produktionsumgebung tun. Überlegen Sie genau, was Sie durch eine browserbezogene Bedingung oder Umschaltung verfügbar machen und wie dies zu einer Sicherheitslücke werden kann.
Javid Jamae

Antworten:

204

Die location.hostnameVariable gibt Ihnen den aktuellen Host. Das sollte ausreichen, um festzustellen, in welcher Umgebung Sie sich befinden.

if (location.hostname === "localhost" || location.hostname === "127.0.0.1")
    alert("It's a local server!");
Unicron
quelle
14
Gibt es nicht eine allgemeinere Lösung, die auch Fälle der Verwendung von 127.0.0.1 usw. abdeckt?
iX3
8
Das ist einfach falsch. Viele Leute bearbeiten ihre Host-Datei, so dass das Wort "localhost" nicht gefunden wird
vsync
4
Genau. Das ist falsch. Funktioniert auch nicht, wenn über ein Netzwerklaufwerk auf eine "lokale" Datei zugegriffen wird.
ProblemsOfSumit
1
@Sumit über die Dateischnittstelle können Sie überprüfen, ob der Hostname leer ist
chacham15
1
Uhh nicht sicher, warum jeder dies als falsch bezeichnet. Dieser einfache Ausschnitt funktioniert perfekt für mich bei Localhost und Produktion. Meine Software kennt das Wetter, um Anzeigen zu schalten - oder auch nicht - mit einer einfachen Codezeile. Danke OP.
Andy
30

Wenn statisches HTML im Browser gestartet wird, z. B. von einem Ort wie der file:///C:/Documents and Settings/Administrator/Desktop/Erkennung von "localhost", funktioniert dies nicht. location.hostnamegibt eine leere Zeichenfolge zurück. so

if (location.hostname === "localhost" || location.hostname === "127.0.0.1" || location.hostname === "")
    alert("It's a local server!");
Tomasz Bujnowski
quelle
Ich bin genau auf dieses Problem gestoßen, und obwohl ich die Lösung selbst herausgefunden habe, sollte diese Antwort immer noch höher sein.
Domsson
6

Immer noch kein Haken, aber es könnte eine kleine Verbesserung sein. Sie können jetzt ein Array von Domänen erstellen und .includes verwenden

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

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

Auf diese Weise wird es in React überprüft , Service Worker registrieren und überprüft, ob Sie sich auf localhost befinden, indem Sie den Hostnamen, einschließlich localhost und IPv6 , überprüfen und mit 127 beginnen :

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}$/
    )
);
Alireza
quelle
2

Eine einfache Möglichkeit, dies zu tun, besteht darin, den Hostnamen anhand von localhost oder Ihren benutzerdefinierten Domänennamen anhand eines Teilstrings zu überprüfen, in diesem Fall ".local" -URLs wie 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!");
}
Gipfel
quelle
2

Kürzeste Form mit derselben Mechanik wie andere Skripte:

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

Dieser behandelt auch einige häufige Fälle, in denen lokale Netzwerk-IPs mit 10.0.oder 192.168.oder Bonjour-ähnlichen Domains beginnen, die auf enden .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'))
  )
}
Holtwick
quelle
1

Sie können in einem Ihrer Codes hinter Seiten mit c # Folgendes erkennen:

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

Wenn Sie dies über das Client-Skript tun möchten, können Sie den Wert von window.location.host überprüfen.

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

Hoffe das hilft.

Samuel Meacham
quelle
3
location.host enthält den Hostnamen UND den Port. Verwenden Sie stattdessen 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;
}
Anteliebe
quelle
0

Die obigen Antworten lösen meistens das Problem, aber ...

  • Was ist, wenn localhost nicht unbedingt 'localhost /' ist?
  • Was ist, wenn Sie während der Entwicklung eine FE-Validierung durchführen möchten?
  • Was ist, wenn Sie während der Entwicklung unterschiedliche Verhaltensweisen wünschen
    (z . B. Validierung, Validierung, keine Validierung ) ?

Eine Lösung besteht darin, den Standort-Hash festzulegen und zu überprüfen.

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

Sie können mit einem Schalter unbegrenzte Optionen hinzufügen

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;
}
Shanimal
quelle
Diese Lösung hat noch einige manuelle Arbeiten und kann manipuliert werden.
A1rPun
Ich denke, die "manuelle Arbeit" ist unbedeutend und manipuliert auch, da wir ohne die Genehmigung von Javascript alles einreichen können, was wir wollen, und die meisten Frameworks haben Filter, die Angriffe abschwächen, bevor die Anfrage jemals die Anwendung erreicht. Möglicherweise ist es ein Risiko, dass das OP die serverseitige Validierung überspringt, aber es wurde nur hinzugefügt, um die Nützlichkeit der Verwendung eines Schlüssels im Hash zu demonstrieren.
Shanimal
Ich verwende weder localhost noch Loopback, da das Whitelisting von Dutzenden internationalisierter Clients (clinetA.com, clientA.de, clientB.com, clientB.au usw.) schnell zu einem Albtraum werden würde. Ich habe mich entschieden, diese Lösung anzubieten, da sie sich nicht um die Domain kümmert und auf einer Live-Site ohne Patch überprüft werden kann.
Shanimal
0

Regulärer Ausdruck ist langsamer *, aber kurz und ordentlich. Außerdem sucht hier niemand nach IPv6 localhost (:: 1)

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

Es wird nach allgemeinem localhost, lokaler Domäne und Datei gesucht: (leerer Hostname).

*) In Chrome ist die Leistung von [].includes(...)am besten (42 ms), gefolgt von einer einfachen Schleife (für, während) mit Überprüfung der Array-Elemente (119 ms), dann [].indexOf(...) > -1(289 ms) und schließlich dem regulären Ausdruck (566 ms). Diese Messungen sind jedoch irgendwie relativ, da verschiedene Browser unterschiedlich optimiert sind. In FF 52 ESR includesund indexOfmit ähnlichen Ergebnissen ist der reguläre Ausdruck 2 × langsamer und die Schleife 6 × langsamer.

mikiqex
quelle
0

Basierend auf den obigen Kommentaren hat mir der folgende reguläre Ausdruck geholfen zu überprüfen, ob die URL 'localhost' ist, eine IP-Adresse IPv4 oder 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)
Papa
quelle