如何使用JavaScript检查连接是否为本地主机?


98

如果页面加载位于我的本地计算机上,我想检查一下我的JavaScript。

我要这样做的原因是,在开发时,我想确保我的两个服务器端(C#)验证均正常工作。因此,我希望同时看到客户端和服务器端的错误。

因此,当我测试时,我的jquery验证标志中有一个标志始终只是使无效数据通过。这样一来,我一眼就能看到客户端和服务器错误。

但是现在,我必须手动进行从开发到生产的来回更改。


3
我只是警告任何人在任何这些答案中使用这些方法中的任何一种,以向系统“添加”功能,特别是如果所述功能可用于在系统中公开其他安全信息或数据的话。但是,使用此技术“删除”功能很有意义。例如,如果您想在开发环境中禁止触发分析跟踪,即使您在生产环境中也是如此。只需仔细考虑一下您通过浏览器端的条件或切换公开的内容,以及它如何可能成为安全漏洞。
Javid Jamae '18

Answers:


205

location.hostname变量为您提供当前主机。这足以确定您所处的环境。

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

14
是否没有更通用的/“包罗万象”解决方案也可以涵盖使用127.0.0.1等的情况?
jacobq 2012年

8
这是错误的。许多人编辑了主机文件,因此找不到“ localhost”一词
vsync

4
我同意。错了 通过网络驱动器访问“本地”文件时,也将不起作用。
ProblemsOfSumit

1
@Sumit通过文件界面可以检查主机名是否为空
chacham15

1
嗯,不知道为什么每个人都说这是错误的。这个简单的片段在localhost和生产环境中非常适合我。我的软件通过1行简单的代码就知道天气是否可以投放广告。谢谢OP。
安迪

30

如果在浏览器中启动静态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!");

我遇到了这个确切的问题,当我自己找到解决方案时,这个答案应该还是更高的。
domsson

6

仍然不是全部,但可能会有一点改进。现在,您可以创建一个域数组并使用.includes

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

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

3

这就是在React中进行检查,注册服务人员的方式,这是通过检查主机名(包括localhostIPv6)并从127开始匹配来检查您是否在localhost上的好方法 :

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

一种简单的方法是仅针对localhost检查主机名,或针对子字符串检查您的自定义域名,在这种情况下为“ .local” URL,例如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

使用与其他脚本相同的机制的最短格式:

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

2

本章还介绍了一些常见的情况,其中本地网络IP以10.0.192.168.或Bonjour 开头,例如域结尾为.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

您可以使用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

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

上面的答案大部分可以解决问题,但是...

  • 如果localhost不一定是'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;
}

该解决方案仍然需要一些手动工作,并且可以被篡改。
A1rPun

我认为“手动工作”无关紧要,因为我们可以在不经javascript批准的情况下提交我们喜欢的任何东西,并且大多数框架都有过滤器,可以减轻请求到达应用程序之前的攻击,因此,“手动工作”也无济于事。也许允许OP跳过服务器端验证是有风险的,但它只是为了显示在哈希中使用密钥的实用程序而添加。
Shanimal

我从不使用本地主机或环回,因为将数十个国际化客户端(clinetA.com,clientA.de,clientB.com,clientB.au等)列入白名单将很快成为噩梦。我决定提供此解决方案,因为它不关心域,并且可以在没有修补程序的实时站点中进行检查。
Shanimal

0

正则表达式较慢*,但简短明了。另外,这里没有人检查IPv6本地主机(:: 1)

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

它检查常规localhost,.local域和文件:(空主机名)。

*)在Chrome中,的性能[].includes(...)最佳(42 ms),其次是简单循环(for,while),先进行数组项检查(119 ms),然后是[].indexOf(...) > -1(289 ms),最后是正则表达式(566 ms)。但是这些度量值是相对的,因为不同的浏览器的优化方式不同。在FF 52 ESR中includesindexOf具有相似的结果,正则表达式慢2倍,循环慢6倍。


0

根据上面的评论,以下正则表达式帮助我验证了网址是否为“ localhost”,任何IP地址IPv4或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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.