使用Javascript获取当前域名(而不是路径等)


246

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

我到处寻找这样的东西,但大多数都无法达到我想要的方式。

例如当使用

document.write(document.location)

JSFiddle上它返回

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

即实际路径或其他。


1
我不确定我是否确切了解您想做什么,但是您可能应该就此考虑MDN
MilkyWayJoe 2012年

有点话题,但是您也可以考虑拥有子域,而不是两个单独的域名。喜欢的东西premium.random.comfree.random.com
T.Chmelevskij

Answers:


456

怎么样:

window.location.hostname

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


55
并且window.location.hostname如果您不想获取port(例如和http://localhost:3000/window.location.host = 'localhost:3000'window.location.hostname = 'localhost'
Guilherme

6
答案是错误的,因为端口不属于域。而window.location.host有时会给端口回来。
Andrej

4
这还会返回服务器名称(“ www.amazingjokes.com”,而不只是“ .amazingjokes.com”)
patrick

如果您有转发DNS,则可能需要使用它
-window.location.ancestorOrigins

125

尝试在脚本中运行:路径:http:// localhost:4200 / landing?query = 1#2

console.log(window.location.hash)

位置具有以下值:

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"

3
这是一个很好的答案!
安德鲁·坎贝尔

2
我喜欢几个例子的答案。非常非常感谢你。
Magno Alberto

24

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

function getDomainName(hostName)
{
    return hostName.substring(hostName.lastIndexOf(".", hostName.lastIndexOf(".") - 1) + 1);
}

13
错误的话,这将在几乎所有国际TLD上中断。
tbranyen 2014年

4
@tbranyen您能解释您指的是什么吗?我能想到的唯一情况是类似的子域amazon.co.uk。但绝对不是“几乎所有国际TLD”。实际上,它可与Wikipedia中找到
兼容

1
由于某种原因,cprcrack我认为更多的国际(对美国)TLD包含多个点。感谢您的纠正!
tbranyen 2014年

许多国家/地区的工作方式与英国类似:它们具有固定的二级域名,您只能在三级域名上注册。这些国家的列表在Wikipedia上
加雷斯

18
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;
}

例子

  • getDomain(' http://www.example.com '); // example.com
  • getDomain('www.example.com'); // example.com
  • getDomain(' http: //blog.example.com',true ); // blog.example.com
  • getDomain(location.href); // ..

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


1
这应该是答案,即使在localhost/test.php正确答案中也可以使用localhost
Mohammad AlBanna

这也是最好的答案,因为它可以与您传入的任何URL一起使用,而不仅是当前window.location
sohtimsso1970

如果您这样做google.co.uk,那将返回'co.uk',这是不正确的……
James Douglas

是。那是一件棘手的事。如果您也拥有子网域,则更加棘手(例如:test.google.co.uk)。如果要使用此原始版本,则需要进行一些认真的调整(甚至可以为这些tlds添加特殊列表)。
adelineu

10

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

例如,此页面的URL是:

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

然后,我们可以使用location对象的以下属性获取确切的域:

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

您可以使用以下方法制作完整域:

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

在此示例中返回 http://www.stackoverflow.com

另外,我们可以获得完整的URL以及具有location对象其他属性的路径:

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"

7

如果您只对域名感兴趣,并且想忽略子域,则需要从host和中解析它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/


为什么它返回jShell而不是jsFiddle?
Freesnöw


7

由于此问题要求提供域名而不是主机名,因此应提供正确答案

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

这也适用于主机名,例如www.example.com


1
此方法有效,但不适用于domain.co.uk,domain.com.br等域名。如何使它与任何域兼容?
Sameh

6

document.write(document.location.hostname)​

window.location有很多特性。请参阅此处以获取它们的列表。


5

如果希望完整的域来源,可以使用以下方法:

document.location.origin

如果您只想获取域,则可以使用:

document.location.hostname

但是您还有其他选择,请看一下其中的属性:

document.location

5

那这个功能呢?

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

这将仅匹配域名,而不管它是子域名还是主域名


1
我喜欢这个答案。但是您应该知道,如果将其用于与安全相关的目的,则可以绕过它。即,如果您想确保自己在example.com上,那么hacker-example.com也将等于“ example.com”。window.location.hostname.match(/ [a-zA-Z0-9-] * $ .. [a-zA-Z0-9-] * $ /)[0]有效。
hiburn8

4

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

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

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

var url = document.URL;
alert(url);


1

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

例:

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

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

输出:

domain.com

要么

www.domain.com

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



0

结合上面的一些答案,以下内容对于我销毁Cookies确实非常有效:

  /**
   * 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]}`;
  }

适用于具有端口(例如0.0.0.0:8000等)的IP地址以及复杂的域(例如app.staging.example.comreturning .example.com=>),可以进行跨域Cookie设置和销毁。


0

如果您想要国家/地区域名-例如,  从stackoverflow.com中提取  .com

(ES6):

const getCountryDomainName = () => {
  let hostName = window.location.hostname;
  let lastDotIndex = hostName.lastIndexOf('.');
  let countryDomainName = hostName.substr(lastDotIndex+1, hostName.length);
  return countryDomainName;
}

(ES5):

function getCountryDomainName() {
  let hostName = window.location.hostname;
  let lastDotIndex = hostName.lastIndexOf('.');
  let countryDomainName = hostName.substr(lastDotIndex+1, hostName.length);
  return countryDomainName;
}

然后,只需使用函数将值分配给var即可:

const countryDomainName = getCountryDomainName();

-2
       Feel free to visit our “<a href="javascript:document.location.href=document.location.origin+'/contact-us'" title="Click to Contact Us" class="coded_link" ><span class="ui-icon ui-icon-newwin"></span>Contact</a>” link

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

刚刚测试了它的工作原理,这要归功于上面在某些答案中提到的方法,因此很快且经过验证就可以


@Brandito谢谢,很好,该站点托管在AWS虚拟主机中,我相信使用wordpress,不知道为什么这样做会给问题带来麻烦...不知道重定向是否错误或必须执行的操作加上后端mod重写规则。另外,我想使用一个jQuery ui主题工具和图标。首先由客户批准:'-)
Jean Paul AKA el_vete
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.