【问题标题】:Determine domain name in JavaScript?在 JavaScript 中确定域名?
【发布时间】:2011-06-04 08:51:49
【问题描述】:

使用有什么区别

if (document.domain.toLowerCase().indexOf("domainName") != -1)

if(window.location.href.match(/:\/\/(.[^/]+)/)[1].toLowerCase().indexOf("domainName") != -1)

if(window.location.hostname.toLowerCase().indexOf("domainName") != -1)

我只是想匹配某个域名,并想使用最好的方法。

【问题讨论】:

  • 我会说需要较少代码量的那个(第一个)是最好的,但我对这三个中的任何一个都没有任何经验,所以......无论如何不要太依赖在这一点上,特别是如果您正在检查与安全相关的内容,因为攻击者可以很容易地绕过它
  • 顺便说一句,你的例子永远不会奏效。您正在调用 toLowerCase(),然后您正在与包含大写“N”的内容进行比较。 :)
  • 啊是的好电话,我用“domainName”代替了实际的域名。但是是的,我在匹配的那个字符串中使用了所有小写字母。

标签: javascript dns


【解决方案1】:

最好和最易读的应该是:

if(location.hostname == "mysite.com"){

}

更新:

或者正如 Patrick 指出的那样,如果您只是在寻找域名的一部分,我会使用 match

if(location.hostname.match('mysite')){} // will return null if no match is found

【讨论】:

  • 如果 location.hostname 为您提供主机名,为什么有人会构建一个 reg exp 来获取它?
  • 唯一的问题是它与 OP 的代码不同。我们不知道是否需要完全匹配。
【解决方案2】:

可读方法:

您可以使用endsWith()hostname字符串的结尾与域名进行比较:

location.hostname === 'stackexchange.com' || location.hostname.endsWith('.stackexchange.com')

注意:这需要 ECMAScript 6 (ES6) 支持。

短法:

或者,如果您希望使用带有 test() 方法的正则表达式,您可以使用:

/(^|\.)stackexchange\.com$/.test(location.hostname)

Split/Join Array-to-String 方法:

此外,您还可以将split()hostname 放入基于. 字符的数组中。然后您可以使用slice()join() 将最后两个元素(域名和扩展名)与. 字符一起作为分隔符,这样您就可以直接与预期的域名进行比较:

location.hostname.split('.').slice(-2).join('.') === 'stackexchange.com'

对于以下类型的 URL,这将返回 true:

【讨论】:

    【解决方案3】:

    你所有的解决方案都没有效率!他们将基本上匹配包含域名的所有内容..例如假设域是“domain.com”

    • `http://prefixdomain.com`
    • `http://domain.com.jo`
    • 子域`http://sub.domain.com`
    • 路径:`http://whatever.com/domain.com`

    所以最好的解决方案是

    function isEquals(myhost){
                  var hostName = window.location.hostname.split('.');
                  myhost = myhost.split(".");
                  //handle stuff like site:.com or ..com
                  for (var x in myhost)
                    if (myhost[x] == "") myhost.splice(x,1);
    
              //j is where to start comparing in the hostname of the url in question
              var j = hostName.length - myhost.length;
              for(var i in myhost)
              {
                  //if j is undefined or doesn't equal the hostname to match return false 
                  if (!hostName[j] || hostName[j].toLowerCase() != host[i].toLowerCase())
                      return false;
                  j++;
              }
              return true;
          }
    

    【讨论】:

    • 虽然这个答案没有回答所提出的问题。分解领域并比较每个单独部分的想法是值得称赞的。虽然我无法理解第二个 for 循环。部分原因是有一个错字host[i] 可能应该是myhost[i]。部分原因是var j 是固定的,并且hostName[j] 正在与myhost[] 的每个元素进行比较。我看不到这个函数将如何返回true
    • 假设我们将http://sub.domain.comhttp://sub.domain.com 进行比较。在这种情况下,j0。因此hostName[0]'http://sub',可以与myhost['http://sub', 'domain', 'com'] 进行比较。在这种情况下,if() 语句的第二个条件在第二次和第三次迭代中将是 true!hostName[j] 应该总是返回 false,除非 hostNameundefined。因此,即使您通过了第一次迭代,您也会在后续迭代中 return false
    • 我希望我在这里实际上误解了一些东西,因为我还没有实际测试过这个功能。但逻辑却另有结论。 @AmjadMasad 如果可以详细说明第二个 for() 循环的内部工作,并指出我看不到它背后的逻辑的地方。我认为你在那里做某事,但我只是看不到它。我很乐意学习新的东西。
    • 我注意到了这个问题。如果我试图重定向到一个 slug,例如:window.location.href = 'login',它会返回 false,而它应该返回 true。我在第一个循环之前添加了一个条件:myhost.length === 1 return true 来解决它。基本上,如果它是格式错误的 url / 本地化域,它应该保留在当前域中。无论如何,使用格式错误的本地化域没有多大意义。您在第二个循环中还有一个小参考错误,!= host[i] 而不是 != myhost[i]
    【解决方案4】:

    第一个和第三个应该简单快捷。在这两者中,我认为这并不重要只要您只是在测试域。

    如果您正在测试子域,请考虑在 javascript 中修改 document.domain,而 window.location.hostname 不能。

    【讨论】:

      【解决方案5】:

      嗯,window.location 是更标准的方式,所以我建议超过document.domain。 IndexOf 将匹配子字符串,这可能不是您想要的。为什么不只是:

      window.location.hostname == "stackoverflow.com"?
      

      我猜对于某些网站,您可能有一个可选的子域。就像 www.domain.com 和只是 domain.com 都去同一个地方。如果这是一个问题,你可以制作一些丑陋的正则表达式,或者你可以只分割点:

      var domainParts = window.location.hostname.split(".");
      domainParts[domainParts.length - 2] == "stackoverflow"
      

      我认为大小写无关紧要,至少在我尝试过的浏览器(Firefox 和 Chrome)中,它们会自动将域名标准化为小写。

      【讨论】:

      • 我明白你在说什么,但是当我可以使用 indexOf() != -1 来查看字符串是否是整个域/子域的子字符串时,为什么还要使用丑陋的正则表达式?
      猜你喜欢
      • 2014-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-02
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多