374

我计划为同一个站点购买两个域名。根据使用的域,我计划在页面上提供略有不同的数据。有没有办法让我检测到页面加载的实际域名,以便我知道将我的内容更改为什么?

我四处寻找这样的东西,但大多数都没有按照我想要的方式工作。

例如使用时

document.write(document.location)

JSFiddle上它返回

http://fiddle.jshell.net/_display/

即实际路径或任何内容。

4

19 回答 19

642

怎么样:

window.location.hostname

location对象实际上有许多属性引用 URL 的不同部分

于 2012-07-09T19:38:18.183 回答
447

假设你有这个 url 路径:

http://localhost:4200/landing?query=1#2

因此,您可以通过location values为自己服务,如下所示:

window.location.hash: "#2"
​
window.location.host: "localhost:4200"
​
window.location.hostname: "localhost"
​
window.location.href: "http://localhost:4200/landing?query=1#2"
​
window.location.origin: "http://localhost:4200"
​
window.location.pathname: "/landing"
​
window.location.port: "4200"
​
window.location.protocol: "http:"

window.location.search: "?query=1"

现在我们可以得出结论,您正在寻找:

window.location.hostname
于 2019-02-14T13:40:56.697 回答
24

如果您对主机名(例如www.beta.example.com)不感兴趣,但对域名(例如 )感兴趣,则example.com这适用于有效的主机名:

function getDomainName(hostName)
{
    return hostName.substring(hostName.lastIndexOf(".", hostName.lastIndexOf(".") - 1) + 1);
}
于 2013-11-12T19:04:23.980 回答
21
function getDomain(url, subdomain) {
    subdomain = subdomain || false;

    url = url.replace(/(https?:\/\/)?(www.)?/i, '');

    if (!subdomain) {
        url = url.split('.');

        url = url.slice(url.length - 2).join('.');
    }

    if (url.indexOf('/') !== -1) {
        return url.split('/')[0];
    }

    return url;
}

例子

以前的版本正在获得完整的域(包括子域)。现在它根据偏好确定正确的域。因此,当第二个参数提供为 true 时,它​​将包含子域,否则仅返回“主域”

于 2015-06-16T20:22:11.517 回答
12

您可以轻松地从 Javascript 中的位置对象获取它:

例如此页面的 URL 是:

http://www.stackoverflow.com/questions/11401897/get-the-current-domain-name-with-javascript-not-the-path-etc

然后我们可以通过位置对象的以下属性获得确切的域:

location.host = "www.stackoverflow.com"
location.protocol= "http:"

您可以使用以下方法创建完整域:

location.protocol + "//" + location.host

在这个例子中返回http://www.stackoverflow.com

我加上这个,我们可以获得完整的 URL 以及具有位置对象其他属性的路径:

location.href= "http://www.stackoverflow.com/questions/11401897/get-the-current-domain-name-with-javascript-not-the-path-etc"    
location.pathname= "questions/11401897/get-the-current-domain-name-with-javascript-not-the-path-etc"
于 2017-01-10T14:00:45.427 回答
8

如果您只对域名感兴趣并且想忽略子域,那么您需要将其解析出hostand hostname

以下代码执行此操作:

var firstDot = window.location.hostname.indexOf('.');
var tld = ".net";
var isSubdomain = firstDot < window.location.hostname.indexOf(tld);
var domain;

if (isSubdomain) {
    domain = window.location.hostname.substring(firstDot == -1 ? 0 : firstDot + 1);
}
else {
  domain = window.location.hostname;
}

http://jsfiddle.net/5U366/4/

于 2012-07-09T19:53:05.417 回答
8

由于这个问题要求的是域名,而不是主机名,因此正确答案应该是

window.location.hostname.split('.').slice(-2).join('.')

这也适用于像www.example.com这样的主机名。

于 2016-12-11T05:18:30.620 回答
7

采用

document.write(document.location.hostname)​

window.location有一堆属性。有关它们的列表,请参见此处

于 2012-07-09T19:38:23.037 回答
7

如果你想要一个完整的域来源,你可以使用这个:

document.location.origin

如果您只想获得域,请使用 can you just this:

document.location.hostname

但是您还有其他选择,请查看以下属性:

document.location
于 2016-06-25T14:10:39.357 回答
5

window.location.hostname是一个好的开始。但它包括您可能想要删除的子域。例如,如果主机名是www.example.com,您可能只需要example.com一点。

与以往一样,有一些极端情况会使这变得繁琐,例如bbc.co.uk. 以下正则表达式对我很有效:

let hostname = window.location.hostname;
// remove any subdomains, e.g. www.example.com -> example.com
let domain = hostname.match(/^(?:.*?\.)?([a-zA-Z0-9\-_]{3,}\.(?:\w{2,8}|\w{2,4}\.\w{2,4}))$/)[1];
console.log("domain: ", domain);

于 2021-01-30T12:41:36.660 回答
4

如果要在 JavaScript 中获取域名,只需使用以下代码:

var domain_name = document.location.hostname;
alert(domain_name);

如果您需要网页 URL 路径以便可以访问 Web URL 路径,请使用以下示例:

var url = document.URL;
alert(url);
于 2017-11-06T10:24:21.957 回答
4

这个功能怎么样?

window.location.hostname.match(/\w*\.\w*$/gi)[0]

这将只匹配域名,无论它是子域还是主域

于 2018-12-16T20:28:08.497 回答
3

我认为它应该像这样简单:

url.split("/")[2]

于 2017-09-19T16:10:30.593 回答
2

就我而言,最好的匹配是 window.location.origin

于 2017-11-26T15:07:46.383 回答
2

结合上面的一些答案,以下内容对我来说非常适合销毁 Cookie:

  /**
   * Utility method to obtain the domain URI:
   */
  fetchDomainURI() {
    if (window.location.port.length > 0) {
      return window.location.hostname;
    }
    return `.${window.location.hostname.match(/\w*\.\w*$/gi)[0]}`;
  }

适用于带有端口的 IP 地址,例如 0.0.0.0:8000 等,以及app.staging.example.com返回.example.com=> 等复杂域,允许跨域 Cookie 设置和销毁。

于 2020-04-07T11:03:36.423 回答
1

我是 JavaScript 新手,但你不能只使用:document.domain吗?

例子:

<p id="ourdomain"></p>

<script>
var domainstring = document.domain;
document.getElementById("ourdomain").innerHTML = (domainstring);
</script>

输出:

domain.com

或者

www.domain.com

取决于您在网站上使用的内容。

于 2019-01-15T20:06:48.843 回答
1

即使问题是关于域名的,接受的解决方案也包括子域(例如,你会blog.example.com打电话location.hostname)。为了将来参考,我建议使用单线仅提取域(例如https://blog.example.com/index.html-> example.com)作为 Micheal。

location.hostname.split('.').filter(( _, i) => i < 2).join('.')

谨防!当 TLD 由两部分(例如.co.uk)组成时,它可能会中断。如果这是您的情况,请在上面的代码中将 2 更改为 3。

于 2021-09-27T20:34:28.857 回答
0

https://publicsuffix.org/list/

https://github.com/publicsuffix/list/blob/master/public_suffix_list.dat

需要正确解析所有没有后缀的域,使用上述答案中的点永远不会完全正确。随意针对公共后缀 dat 文件运行上述代码示例以实现这一点。

您可以基于此滚动您自己的代码或使用像https://www.npmjs.com/package/tldts这样的包

getDomainWithoutSuffix('google.com');        // returns `google`
getDomainWithoutSuffix('fr.google.com');     // returns `google`
getDomainWithoutSuffix('fr.google.google');  // returns `google`
getDomainWithoutSuffix('foo.google.co.uk');  // returns `google`
getDomainWithoutSuffix('t.co');              // returns `t`
getDomainWithoutSuffix('fr.t.co');           // returns `t`
getDomainWithoutSuffix('https://user:password@example.co.uk:8080/some/path?and&query#hash'); // returns `example`
于 2022-01-09T10:38:06.933 回答
-4

随意访问我们的“<a href="javascript:document.location.href=document.location.origin+'/contact-us'"title="点击联系我们" class="coded_link" >联系”链接

确实为我工作,而我不能使用 PHP

由于上面在一些答案中提到的方法,刚刚测试它是否有效,如此快速且经过验证,有效

于 2019-11-25T04:02:10.700 回答