location.host与location.hostname和跨浏览器的兼容性?


365

与检查用户代理是否通过正确的域进行访问相比,以下哪一项最有效。

如果他们使用某种Web代理访问域,我们想显示一个基于js的小“顶栏”样式警告(因为它倾向于破坏JS)。

我们正在考虑使用以下内容:

var r = /.*domain\.com$/;
if (r.test(location.hostname)) {
    // showMessage ...
}

这将照顾到我们曾经使用过的任何子域。

我们应该使用哪个主机名或主机名?

在Firefox 5和Chrome 12中:

console.log(location.host);
console.log(location.hostname);

..对两个都显示相同的内容。

那是因为端口实际上不在地址栏中吗?

W3Schools说主机包含端口。

应该验证一下location.host/hostname还是在IE6 +中以及我们将要存在的所有其他内容中完全确定?


6
需要注意的一件事是,谷歌浏览器具有location.origin,而MSIE和Firefox没有。 developer.mozilla.org/En/Window.location - msdn.microsoft.com/en-us/library/ms952653.aspx
KEYO


Answers:


1063

交互式链接解剖

作为一个小提示:交互式链接剖析

-

简而言之(假设位于http://example.org:8888/foo/bar#bang):

  • hostname 给你 example.org
  • host 给你 example.org:8888

87
一张图片胜过千言万语。
杰克·吉芬

4
@lolzerywowzery ...但仅需描述图像的那千字就可以了
Agi Hammerthief

1
根据en.wikipedia.org/wiki/…,该端口不应视为主机的一部分(但应是授权的一部分)。
亚历克

@Alec这是一个有趣的技术说明;通过Wikipedia引文进行的深入研究表明,根据RFC 3986,“权限” 应该是主机名:,和端口的串联的术语。我想知道从location.host制定之时起仍然有多少讨论可用...我怀疑它之所以今天这样被命名,是因为目前没有人阅读或认为提及RFC。
JamesTheAwesomeDude

非常感谢您提供的简单解决方案
Tarun Nagpal,

70

如果指定了主机号,则主机仅包含端口号。如果URL中没有专门的端口号,则它返回与主机名相同的端口号。您可以选择是否要匹配端口号。有关更多信息,请参见https://developer.mozilla.org/en/window.location

我假设您希望主机名仅获取站点名称。


33

如果您坚持使用,则window.location.origin 可以在阅读本文之前将其放在代码顶部origin

if (!window.location.origin) {
  window.location.origin = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port: '');
}

PS:记录下来,这实际上是最初的问题。它已经被编辑了:)


5
但是.... OP window.location.origin在他们的问题中从未提及。他们的问题其实是关于具体的东西都是 window.location.origin
温德普斯2014年

1
同样值得注意的是window.location.origin存在浏览器兼容性问题。developer.mozilla.org/en-US/docs/Web/API/Window/...
斯科特

10

您的主要问题已在上面回答。我只是想指出您使用的正则表达式有一个错误。它也将在foo-domain.com不属于的子域上成功domain.com

您真正想要的是:

/(^|\.)domain\.com$/


0

只是要注意,谷歌浏览器具有该位置的来源属性。如下面的屏幕快照所示,它为您提供了从协议到端口号的整个域。 chrome开发人员工具

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.