2010-07-01 8 views
48

Ich möchte in meinem Javascript einchecken, wenn die Seite auf meinem lokalen Rechner geladen wird.Wie man mit Javascript prüft, wenn Verbindung lokaler Wirt ist?

Der Grund, warum ich das tun möchte, ist, dass ich bei der Entwicklung sicherstellen möchte, dass meine serverseitige (C#) Validierung korrekt funktioniert. Daher möchte ich, dass sowohl die Clientseite als auch die Serverseitenfehler angezeigt werden.

Also, während ich teste ich habe eine Fahne in meinem jquery validate Sachen, die immer nur ungültige Daten durchlassen. Auf diese Weise sehe ich die Clientseite und Serverfehler auf einmal.

Allerdings muss ich jetzt manuell gehen und hin und her wechseln, wenn ich von der Entwicklung zur Produktion gehe.

Antwort

101

Die location.hostname Variable gibt Ihnen den aktuellen Host. Das sollte genug sein, damit Sie die Umgebung, die Sie sind in, um zu bestimmen

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

Gibt es nicht eine allgemeinere/„catch-all“ -Lösung, die auch Fälle der Verwendung 127.0.0.1 abdecken würde, usw.? – iX3

+8

Das ist einfach falsch. Viele Leute bearbeiten ihre Host-Datei, so dass das Wort "localhost" nicht gefunden wird. – vsync

+4

ich stimme zu. Das ist falsch. Funktioniert auch nicht beim Zugriff auf eine "lokale" Datei über ein Netzlaufwerk. – ProblemsOfSumit

2

Sie in einem Ihrer Code hinter Seiten mit C# erkennen konnte, wie folgt aus:.

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

Oder wenn Sie tun möchten, Aus dem Client-Skript heraus können Sie den Wert von window.location.host überprüfen.

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

Ich hoffe, dies hilft.

+3

location.host enthält den Hostnamen AND-Port. Verwenden Sie stattdessen location.hostname. – pmont

0

Die oben genannten Antworten lösen meist das Problem, aber ...

  • Was passiert, wenn localhost ist nicht unbedingt ‚localhost /‘?
  • Was ist, wenn Sie die FE-Validierung während der Entwicklung durchführen möchten?
  • Was ist, wenn Sie unterschiedliche Verhaltensweisen während dev wollen
    (fe Validierung, Validierung, keine Validierung)

Eine Lösung ist die Lage Hash einstellen und überprüfen.

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

Sie unbegrenzte Möglichkeiten mit einem Schalter

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

Diese Lösung hat noch einige manuelle Arbeit und kann manipuliert werden. – A1rPun

+0

Ich denke, die "manuelle Arbeit" ist unbedeutend, Manipulation auch, da wir alles, was wir wollen, ohne Javascript Genehmigung zusenden und die meisten Frameworks haben Filter, die Angriffe mildern, bevor die Anfrage jemals die Anwendung erreicht. Vielleicht ist es ein Risiko, dem OP zu erlauben, die serverseitige Validierung zu überspringen, aber es wurde nur hinzugefügt, um den Nutzen der Verwendung eines Schlüssels im Hash zu zeigen. – Shanimal

+0

Ich benutze nie localhost oder das Loopback, weil das Whitelisting Dutzender internationalisierter Clients (clinetA.com, clientA.de, clientB.com, clientB.au, etc ...) schnell zum Albtraum werden würde. Ich entschied mich, diese Lösung anzubieten, weil es sich nicht um die Domain kümmert und in einer Live-Site ohne Patch überprüft werden kann. – Shanimal

1

Eine einfache Möglichkeit, dies zu tun wäre, nur den Hostnamen überprüfen gegen localhost oder überprüfen Sie Ihre benutzerdefinierten Domain-Namen gegen einen Teilkette entstehen, kann in dieser 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!"); 
} 
7

wenn starten statische hTML-Browser, zB von Ort wie file:///C:/Documents and Settings/Administrator/Desktop/ Erkennung von "localhost" wird nicht funktionieren. location.hostname wird leere Zeichenfolge zurückgeben. also

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

Ich lief genau in dieses Problem und während ich die Lösung selbst dachte, sollte diese Antwort noch höher sein. – domsson

1

Immer noch kein Haken alles, aber es könnte ein wenig Verbesserung sein. Sie können nun eine Reihe von Domains erstellen und verwenden .includes

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

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