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

时间:2009-09-02 15:03:34

标签: javascript hostname

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

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

仅提取主持人部分:

aaa.bbb.ccc.com

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

13 个答案:

答案 0 :(得分:753)

假设您有一个包含此地址的页面: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

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

特别感谢@torazaburo向我提及。

答案 1 :(得分:144)

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

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

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

答案 2 :(得分:35)

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

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

答案 3 :(得分:20)

有两种方法。第一个是这里的另一个答案的变体,但是这个解释了非默认端口:

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");
}

答案 4 :(得分:14)

接受的答案对我不起作用,因为希望能够处理任何仲裁URL,而不仅仅是当前的页面URL。

查看URL object

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"

答案 5 :(得分:7)

使用

  

window.location.origin

和for:“http://aaa.bbb.ccc.ddd.com/sadf.aspx?blah

你会得到:http://aaa.bbb.ccc.ddd.com/

答案 6 :(得分:6)

尝试

document.location.host

document.location.hostname

答案 7 :(得分:3)

我使用的是另一个hack,并且从未在任何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.html之类的网址上, root将设置为http://domain.com/somesite/。 这也适用于localhost或任何有效的基本URL。

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

另一种变体使用虚拟链接,对HTTP请求没有副作用:

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

但我没有在每个浏览器上测试它。

答案 8 :(得分:2)

检查一下:

alert(window.location.hostname);

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

window.location.host

将返回包含www.example.com:80

等端口的域名

有关完整参考检查Mozilla developer网站。

答案 9 :(得分:2)

我想说明一些事情。如果有人想要使用我需要的路径获取整个网址,可以使用:

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

答案 10 :(得分:2)

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

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

它也可以在ES5中编写,如

Object.assign

当然IE不支持{{1}},但在我的工作中,这并不重要。

答案 11 :(得分:0)

Regex提供了更多的灵活性。

    //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

答案 12 :(得分:0)

我的解决方案可在包括Microsoft Internet Explorer在内的所有Web浏览器中使用,并且不使用任何正则表达式,它的灵感来自于Noah Cardoza和Martin Konecny解决方案:

function getHostname(href) {
    if (typeof URL === 'object') {
        // workaround for MS IE 11 (Noah Cardoza's solution but without using Object.assign())
        var dummyNode = document.createElement('a');
        dummyNode.href = href;
        return dummyNode.hostname;
    } else {
        // Martin Konecny's solution
        return new URL(href).hostname;
    }
}