如何在JavaScript中提取URL的主机名部分


379

是否有一种从完整网址开始的简单方法:

document.location.href = "http://aaa.bbb.ccc.com/asdf/asdf/sadf.aspx?blah"

并仅提取主机部分:

aaa.bbb.ccc.com

必须有一个可靠地执行此操作的JavaScript函数,但我找不到它。

Answers:


826

假设您有一个地址为的页面http://sub.domain.com/virtualPath/page.htm。使用页面代码中的以下内容获得这些结果:

  • window.location.host:您会得到sub.domain.com:8080sub.domain.com:80
  • window.location.hostname : 你会得到 sub.domain.com
  • window.location.protocol : 你会得到 http:
  • window.location.port:您会得到808080
  • window.location.pathname : 你会得到 /virtualPath
  • window.location.origin:你会得到http://sub.domain.com*****

更新:关于.origin

*****如参考文献所述,浏览器的兼容性window.location.origin尚不清楚。我已经在chrome中检查了http://sub.domain.com:port该端口,http://sub.domain.com如果端口不是80 ,则返回该端口,如果端口是80 ,则返回该端口。

特别感谢@torazaburo向我提及。


我有一个网站和IIS中的2个应用程序。例如:sub.domain.com/v1sub.domain.com/v2以及诸如sub.domain.com/v1/Default.aspxsub.domain.com/v2/Products/Default.aspx之类的页面,等等。可以得到值/ v2,这是我的应用程序sub.domain.com/v2的根目录?
Kiquenet

@Kiquenet使用WebStorm之类的JavaScript IDE,在编写代码时会看到可能的选项。
Bhargav Nanekalva '16

3
window.location.origin在IE9中未定义(根据链接,为IE11 +)。这个答案有所帮助。
Neolisk

1
显然对几乎每个人都有用,但它不能回答以下问题:如何从URL中提取主机部分。有趣的是,使用getRootUrl函数的正确答案只有17票对609票。
米罗(Miro)

@Miro问题得到了回答,不是,第二个要点回答了这个问题:window.location.hostname:您将获得sub.domain.com
Paul

155

您可以连接位置协议和主机:

var root = location.protocol + '//' + location.host;

对于网址,可以说'http://stackoverflow.com/questions',它将返回'http://stackoverflow.com'


5
似乎您应该使用“主机名”而不是“主机”来实现上述结果。来源:stackoverflow.com/questions/6725890/...
user417669

您可以使用location.origin获得相同的结果。
塞尔吉奥

1
原始问题未要求提供URL的协议部分。
西蒙·伊斯特

36

使用document.location对象及其hosthostname属性。

alert(document.location.hostname); // alerts "stackoverflow.com"

29

接受的答案对我不起作用,因为它希望能够使用任何任意网址,而不仅仅是当前页面的网址。

看一下URL对象

var url = new URL("http://aaa.bbb.ccc.com/asdf/asdf/sadf.aspx?blah");
url.protocol;  // "http:"
url.hostname;  // "aaa.bbb.ccc.com"
url.pathname;  // "/asdf/asdf/sadf.aspx"
url.search;    // "?blah"

1
谢谢。数小时以来,我一直在寻找从api中提取网址的方法。很简单。我只在带有新URL的url中读取了它。谢谢。
Nodirabegimxonoyim

1
+99999999999999
ADJenks,

这里的两个答案之一不假定您是浏览器方面的人……
Will59,

不适用于IE11 :(
Teoman shipahi

24

有两种方法。第一个是此处另一个答案的变体,但这是非默认端口的原因:

function getRootUrl() {
  var defaultPorts = {"http:":80,"https:":443};

  return window.location.protocol + "//" + window.location.hostname
   + (((window.location.port)
    && (window.location.port != defaultPorts[window.location.protocol]))
    ? (":"+window.location.port) : "");
}

但我更喜欢这种简单的方法(可与任何URI字符串一起使用):

function getRootUrl(url) {
  return url.toString().replace(/^(.*\/\/[^\/?#]*).*$/,"$1");
}

3
谢谢!我也更喜欢第二种方法!尤其是在服务器端javascript上,无法获取window.location :)
万亿

这里的两个答案之一不假定您是浏览器方面的人...但是,请使用新的URL检查Martin Konecny的最新答案。
Will59



3

我使用了另一个技巧,但从未在任何StackOverflow响应中看到该技巧:使用图像的“ src”属性将产生您网站的完整基本路径。例如 :

var dummy = new Image;
dummy.src = '$';                  // using '' will fail on some browsers
var root = dummy.src.slice(0,-1); // remove trailing '$'

在类似的网址上http://domain.com/somesite/index.htmlroot将设置为http://domain.com/somesite/。这也适用于localhost或任何有效的基本URL。

请注意,这将导致$虚拟映像上的HTTP请求失败。您可以使用现有图像来避免这种情况,只需稍作更改即可。

另一个变体使用伪链接,对HTTP请求没有副作用:

var dummy = document.createElement ('a');
dummy.href = '';
var root = dummy.href;

不过,我并未在每个浏览器上都进行过测试。


3

检查一下:

alert(window.location.hostname);

这将返回主机名 www.domain.com

和:

window.location.host

将返回带有以下端口的域名 www.example.com:80

有关完整参考,请访问Mozilla开发人员站点。


2

我想指定一些东西。如果有人想使用我需要的路径获取整个URL,可以使用:

var fullUrl = window.location.protocol + "//" + window.location.hostname + window.location.pathname;

为什么要走更长的路。可以使用var fullUrl = window.location.origin + window.location.pathname来获取
Anant

但有时要像协议和主机名如多语言等之间的子域添加的东西
crx4

2

我知道这有点晚了,但是我用一点ES6语法做了一个干净的小函数

function getHost(href){
  return Object.assign(document.createElement('a'), { href }).host;
}

也可以像这样在ES5中编写

function getHost(href){
  return Object.assign(document.createElement('a'), { href: href }).host;
}

IE当然不支持Object.assign,但是在我的工作中,这并不重要。


1

正则表达式提供了更多的灵活性。

    //document.location.href = "http://aaa.bbb.ccc.com/asdf/asdf/sadf.aspx?blah
    //1.
     var r = new RegExp(/http:\/\/[^/]+/);
     var match = r.exec(document.location.href) //gives http://aaa.bbb.ccc.com

    //2. 
     var r = new RegExp(/http:\/\/[^/]+\/[^/]+/);
     var match = r.exec(document.location.href) //gives http://aaa.bbb.ccc.com/asdf
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.