如何使用JavaScript查找浏览器连接的服务器IP地址?

38

有没有办法找到浏览器连接的服务器的IP地址?例如,如果浏览器正在访问http://www.google.com,我们能否通过某种方式知道它连接的IP地址?在实现轮询DNS的情况下,这非常有用。所以,假设第一次请求 a.com 的结果是 1.1.1.1,随后的请求结果是 1.1.1.2 等等。

我无法找到使用JavaScript的方法。这是否可能?如果不是,请问有没有通用的方法可以找到这些信息?


一种方法是通过ajax对location.host进行DNS查找。但这并不完全是JS。 - rdiz
请参考以下相关问题:https://dev59.com/6HVD5IYBdhLWcg3wDXJ3 - D A
11个回答

55

尝试使用此方法作为快捷方式,而不是确定性解决方案(请参见评论):

<script type="text/javascript">
    var ip = location.host;
    alert(ip);
</script>

这种解决方案在某些情况下可能无法使用,但可以帮助进行快速测试。 谢谢


22
这个参数的含义是 (host) URL 的主机部分,而不是 IP 地址。 - matpie
@sirlancelot 在某些情况下,主机名和IP地址将匹配,在其他情况下则不会。 - Spacemonkey
这就是我需要的。我只需要从URI中获取主机名即可。 - tedi
@tedi 获取主机名应使用location.hostname或window.location.hostname。 - Avi

19

我相当确定这是不可能的。但是你可以使用自己喜欢的服务器端语言将服务器的IP打印到客户端,然后按照自己的需要使用它。例如,在PHP中:

<script type="text/javascript">
    var ip = "<?php echo $_SERVER['SERVER_ADDR']; ?>";
    alert(ip);
</script>

这取决于你服务器的安全设置 - 有些可能会阻止此操作。


1
我们不使用PHP,但我明白你的意思。无论如何,如果服务器被NAT了,这个方法还能行得通吗? - John
老实说,我不确定,你可以试一试 - 这很简单。我在不到一分钟的时间内创建了我发布的测试用例。.NET、ColdFusion和其他大多数服务器端语言都有它们的等效物! - Jason Berry
2
不,如果服务器被NAT并且只有内部IP,则不正确。 - Simon East

13

不确定如何获取IP地址,但是location对象提供了答案的一部分。

例如,这些变量可能有帮助:

  • self.location.host - 设置或检索位置的主机名和端口号
  • self.location.hostname - 设置或检索位置或URL的主机名部分。

3
self.location.origin -> 提供协议 + 主机名 + 端口号 - Andrew Norman

7

我认为您可以使用JSONP请求的回调函数或者只是使用纯JSON数据,但基于JavaScript location.host的输出结果,可以通过外部服务实现这一点:

$.getJSON( "//freegeoip.net/json/" + window.location.host + "?callback=?", function(data) {
    console.warn('Fetching JSON data...');
    // Log output to console
    console.info(JSON.stringify(data, null, 2));
});

我会将这段代码用于我的个人需求,因为一开始我也是为了同样的原因来到这个网站。

你可以使用另一个外部服务代替我所使用的服务。有一个非常棒的列表包含了在这里进行的测试:https://dev59.com/VnRC5IYBdhLWcg3wKtv2#35123097


1
问题是关于服务器的IP地址,这将为您提供客户端的IP地址。 - Andris
看一下 JavaScript 部分... 'window.location.host' 返回服务器名称,因此服务将使用它并从客户端返回服务器 IP ... 而不是客户端 IP - Jiab77
啊,我明白了,你说得对,但只是部分正确。我想使用这个来检查我连接的服务器是否在预定义的IP上,但解析主机名将给出官方而不是实际的IP。 - Andris
此 API 端点已被弃用并将停止工作...网站:https://github.com/apilayer/freegeoip#readme" 你有其他的网站吗? - Tenz
支付和未支付有什么区别?你知道我们在未支付和支付方面有什么吗? - Tenz
显示剩余3条评论

5

通常情况下,您无法获取此信息。从Javascript中,您只能获取HTTP标头,其中可能有也可能没有IP地址(通常只有主机名)。浏览器程序的一部分是将TCP/IP地址抽象化并仅允许您处理主机名。


3

你可以在location.hostname上进行nslookup!

注释中的说明

如果您想复制粘贴不带修改的内容,请向下滚动到完美的片段

方法1 (使用此方法更好)

使用DoHjs!

将以下内容添加到HTML:

<script src="https://cdn.jsdelivr.net/npm/dohjs@latest/dist/doh.min.js"></script>

然后在JS中:

const resolver = new doh.DohResolver('https://1.1.1.1/dns-query');
resolver.query(location.hostname, 'A')
  .then(response => {
    response.answers.forEach(ans => console.log(ans.data));
  })
  .catch(err => console.error(err));

请参阅DoHjs,了解有关此方法的更多信息。

方法2 (现已失效)

使用enclout API:

const oReq = new XMLHttpRequest();
oReq.onload = function () {
  const response = JSON.parse(this.responseText);
  alert(JSON.stringify(response.dns_entries));
}  
oReq.open("get", "https://www.enclout.com/api/v1/dns/show.json?auth_token=rN4oqCyJz9v2RRNnQqkx&url=" + encodeURIComponent(location.hostname), true);
oReq.send();

如果您不信任这个代码片段,那么如何工作的内容在评论中以及此答案的早期部分中有描述。
这是方法1 + 评论
一个完美的代码片段(如果您只想复制粘贴)

function getIP() {
  return new Promise((resolve, reject) => {
    const resolver = new doh.DohResolver("https://1.1.1.1/dns-query");
    resolver
      .query(location.hostname, "A")
      .then((response) => {
        response.answers.forEach((ans) => {
          resolve(ans.data)
        });
        if (response.answers.length == 0) {
          resolve(location.hostname)
        }
      })
      .catch((err) => reject(err));
  });
}

getIP().then((res) => {
  document.getElementById("ip").innerText = res;
});
<script src="https://cdn.jsdelivr.net/npm/dohjs@latest/dist/doh.min.js"></script>
<p>The IP this is running on will be displayed below.</p>
<p id="ip"></p>


如果“answers”为空,则很可能“location.hostname”已经是IP地址。您可以实现一个补丁,如果“answers”为空,就使用“location.hostname”。 - Shaurya Chhabra
如果存在CNAME记录,您也必须解析其IP地址。 - Shaurya Chhabra

2

可以通过插件进行操作,例如Java applet或Flash,然后在Javascript中调用applet中的函数,反之亦然(或者在JS中调用Flash或其他插件中的功能),然后返回IP。这可能不是浏览器用于获取页面内容的IP。此外,如果有图像、CSS、JS等资源,浏览器可能已经建立了多个连接。我认为大多数浏览器只使用DNS调用返回的第一个IP地址(成功连接的IP),不确定如果一个节点在获取了几个资源后崩溃并且仍需获取其他资源时会发生什么情况-计时器/ ajax添加引用到其他资源的HTML)。

如果要使用Java applet,则必须签名,连接到window.location(从Javascript中获得,在applet通用且可在任何服务器上的任何页面上使用的情况下)否则返回到主服务器并使用java.net.Address获取IP地址。


FF应该在获取页面时暴露主IP和用于各种资源的IP列表 - 可能在页面选项中或可用于扩展。 - tgkprog

2

实际上,除非您使用某些外部资源,否则无法通过JavaScript完成此操作。即使如此,它也可能不是100%正确的。


1
我认为John的答案是正确的。例如,我正在通过会议中心提供的wifi服务使用我的笔记本电脑 - 我非常确定浏览器内运行的javascript无法发现服务提供商使用的IP地址。另一方面,可能可以从javascript中访问适当的外部资源。您可以编写自己的代码,通过向服务器发起ajax调用来获取HTTP标头中的IP地址并返回它,或尝试搜索“查找我的IP”。最清晰的解决方案可能是在页面被服务之前捕获信息并将其插入返回给用户的HTML中。 如果您正在使用Python提供页面,请参见如何使用Python获取查看者的IP地址?以了解如何捕获信息。

-3

<script type="application/javascript">
  function getIP(json) {
    document.write("My public IP address is: ", json.ip);
  }
</script>
<script type="application/javascript" src="http://ipinfo.io/?format=jsonp&callback=getIP"></script>


2
请重新阅读问题。问题提问者询问的是服务器的IP地址,而不是客户端的。 - Hoppeduppeanut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接