有没有办法找到浏览器连接的服务器的IP地址?例如,如果浏览器正在访问http://www.google.com,我们能否通过某种方式知道它连接的IP地址?在实现轮询DNS的情况下,这非常有用。所以,假设第一次请求 a.com
的结果是 1.1.1.1
,随后的请求结果是 1.1.1.2
等等。
我无法找到使用JavaScript的方法。这是否可能?如果不是,请问有没有通用的方法可以找到这些信息?
有没有办法找到浏览器连接的服务器的IP地址?例如,如果浏览器正在访问http://www.google.com,我们能否通过某种方式知道它连接的IP地址?在实现轮询DNS的情况下,这非常有用。所以,假设第一次请求 a.com
的结果是 1.1.1.1
,随后的请求结果是 1.1.1.2
等等。
我无法找到使用JavaScript的方法。这是否可能?如果不是,请问有没有通用的方法可以找到这些信息?
尝试使用此方法作为快捷方式,而不是确定性解决方案(请参见评论):
<script type="text/javascript">
var ip = location.host;
alert(ip);
</script>
这种解决方案在某些情况下可能无法使用,但可以帮助进行快速测试。 谢谢
host
) URL 的主机部分,而不是 IP 地址。 - matpie我相当确定这是不可能的。但是你可以使用自己喜欢的服务器端语言将服务器的IP打印到客户端,然后按照自己的需要使用它。例如,在PHP中:
<script type="text/javascript">
var ip = "<?php echo $_SERVER['SERVER_ADDR']; ?>";
alert(ip);
</script>
这取决于你服务器的安全设置 - 有些可能会阻止此操作。
不确定如何获取IP地址,但是location对象提供了答案的一部分。
例如,这些变量可能有帮助:
self.location.host
- 设置或检索位置的主机名和端口号self.location.hostname
- 设置或检索位置或URL的主机名部分。我认为您可以使用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
通常情况下,您无法获取此信息。从Javascript中,您只能获取HTTP标头,其中可能有也可能没有IP地址(通常只有主机名)。浏览器程序的一部分是将TCP/IP地址抽象化并仅允许您处理主机名。
你可以在location.hostname
上进行nslookup!
注释中的说明
如果您想复制粘贴不带修改的内容,请向下滚动到完美的片段。
使用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,了解有关此方法的更多信息。
使用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();
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>
可以通过插件进行操作,例如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地址。
实际上,除非您使用某些外部资源,否则无法通过JavaScript完成此操作。即使如此,它也可能不是100%正确的。
<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>
location.host
进行DNS查找。但这并不完全是JS。 - rdiz