2010-07-01 57 views
48

如果装入的页面位于本地计算机上,我想检查我的javascript。如果连接是本地主机,如何检查与JavaScript?

我想这样做的原因是,当我开发我喜欢确保我的服务器端(C#)验证工作正常。所以我喜欢看到客户端和服务器端出现错误。

所以,当我测试我有一个标志在我的jquery验证的东西,只是总是让无效的数据通过。这样我就能一眼就看到客户端和服务器错误。

但是现在我必须在开发到生产之间来回切换。

回答

101

location.hostname变量为您提供当前主机。这应该是足以让你确定你是在哪个环境

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

是不是有一个更一般/“一揽子”解决方案,这也将涉及到使用127.0.0.1等的情况? – iX3 2012-10-10 18:21:19

+8

这只是错误的。许多人编辑他们的主机文件,所以'localhost'这个词不会被发现 – vsync 2013-08-01 18:57:50

+4

我同意。这是错误的。通过网络驱动器访问“本地”文件时也不起作用。 – ProblemsOfSumit 2013-08-13 14:59:48

2

你可以发现在C#中的网页背后的代码中的一个,像这样:

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

或者,如果你想要做的它来自客户端脚本,你可以检查window.location.host的值。

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

希望这会有所帮助。

+3

location.host包含主机名和端口。改为使用location.hostname。 – pmont 2015-09-10 18:54:51

0

以上答案主要解决的问题,但...

  • 如果本地主机什么是不一定的 'localhost /'?
  • 如果您想在开发过程中进行FE验证,该怎么办?
  • 如果你开发过程中需要不同的行为
    FE的验证,是验证,没有验证

一种解决方案是设置位置哈希和检查。

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

您可以添加无限的选择与交换机

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

该解决方案仍然有一些手动工作,可能会被篡改。 – A1rPun 2017-01-09 10:33:45

+0

我认为“手动工作”是微不足道的,也是篡改,因为我们可以提交我们喜欢的任何内容,而不需要JavaScript的批准,大多数框架都有过滤器,在请求到达应用程序之前缓解攻击。也许允许OP跳过服务器端验证是一种风险,但它只是被添加来显示在散列中使用密钥的效用。 – Shanimal 2017-01-09 18:27:49

+0

我从不使用本地主机或环回,因为将几十个国际化客户端(clinetA.com,clientA.de,clientB.com,clientB.au等)列入白名单很快就会变成一场噩梦。我决定提供这个解决方案,因为它不关心域,可以在没有补丁的情况下在现场进行检查。 – Shanimal 2017-01-09 18:28:01

1

一个简单的方法来做到这一点是只检查对本地主机的主机名或检查您的自定义域名对一个字符串,在这种情况下“本地”的网址,比如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

如果启动静态HTML浏览器,例如从位置一样file:///C:/Documents and Settings/Administrator/Desktop/检测“localhost”不起作用。 location.hostname将返回空字符串。所以

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

我遇到了这个确切的问题,而我自己想出了解决方案,这个答案仍然应该更高。 – domsson 2017-03-14 10:48:56

1

仍然没有抓住所有,但它可能是一个小改进。 现在,您可以创建域的数组,并使用.includes

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

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