如何确定 document.referrer 是不是来自我自己的站点?

Posted

技术标签:

【中文标题】如何确定 document.referrer 是不是来自我自己的站点?【英文标题】:How can I determine if the document.referrer is from my own site?如何确定 document.referrer 是否来自我自己的站点? 【发布时间】:2011-05-20 18:01:29 【问题描述】:

每次请求页面时,我都会获得该页面的来源。我只需要跟踪来自其他网站的引荐来源网址,我不想在我的网站中跟踪从一个页面到另一个页面。我该怎么做?

【问题讨论】:

哇,问了这个问题,然后在不到 1 分钟的时间内回答了这个问题,并提供了指向您自己网站的链接? 我认为发布解决方案是件好事。我很确定其他人也遇到了同样的问题。 @Richard 实际上 *** 建议以这种方式发布有用的问答。一旦获得足够的积分,您就可以在一次提交中完成。 @David 是的,这是 *** 的最初原因之一。所以程序员可以像这样粘贴问答,而不必写博客文章。 其实在 SO 中推荐自己编写问答对。它只是不喜欢只有外部链接的答案。 【参考方案1】:
document.referrer.indexOf(location.protocol + "//" + location.host) === 0;

【讨论】:

@Eric:不。这不是正则表达式,而是字符串。 "//" 不需要转义。 不计算子域引荐来源网址。我们有bag.website.com 和家具.website.com,在这种情况下,即使用户在同一个平台/主域上,这也是错误的。【参考方案2】:

原帖于javascript - Am I the Referrer?

当有人第一次访问我们的网站时,我们会将推荐人存储在 cookie 中。这样,如果他们下载了我们的演示,我们可以从 cookie 中获取原始引荐来源网址,并了解哪些网站可以有效地为我们带来潜在客户。

当然,访问者在我们网站上点击的每个后续页面都会将推荐人显示为我们的网站。我们不想要那些。为了避免这种情况,我们首先要做的是在引荐来源网址中查找文本“windward”,如果是这样,则假设它来自我们的网站。问题是我们发现很多引荐来源网址现在都有迎风,无论是作为搜索词还是作为谈论迎风的网址的一部分。 (这是个好消息,这意味着我们现在是一个众所周知的产品。)

这让我想到了我们最近的方法。这应该适用于任何网站,并且应该只拒绝来自同一网站的引荐来源。

function IsReferredFromMe()


    var ref = document.referrer;
    if ((ref == null) || (ref.length == 0)) 
        return false;
    
    if (ref.indexOf("http://") == 0) 
        ref = ref.substring(7);
    
    ref = ref.toLowerCase();

    var myDomain = document.domain;
    if ((myDomain == null) || (myDomain.length == 0)) 
        return false;
    
    if (myDomain.indexOf("http://") == 0) 
        myDomain = myDomain.substring(7);
    
    myDomain = myDomain.toLowerCase();

    return ref.indexOf(myDomain) == 0;

【讨论】:

https 不是这样吗? @Pureferret - 是的,也需要处理 https。这是 2010 年写的,当时公共网站几乎都是 http。【参考方案3】:

如果网站中没有子域,如果存在子域,那么我们必须在域本身之前检查是否存在任何子域:

document.referrer.replace("http://", '').replace("https://", '').split('/')[0].match(new   RegExp(".*" +location.host.replace("www.", '')))

此解决方案将在域前添加 .* 以检测该子域是否来自同一域。

【讨论】:

【参考方案4】:

如果您认为“同一网站”的页面具有相同的来源(相同的协议主机端口.),

这样检查:

function the_referrer_has_the_same_origin() 
    try 
        const referrer = new URL(document.referrer);
        return (referrer.origin === location.origin);
     catch(invalid_url_error) 
        return false;
    

// Works as intended for `https://www.google.com` and `https://www.google.com:443`.

.

如果你想要一个短的并且不考虑不太可能的情况,试试这个:

document.referrer.startsWith(location.origin)
// Fails for `https://www.google.com` and `https://www.google.com:443`.

.

【讨论】:

【参考方案5】:
document.referrer.includes(location.host);

【讨论】:

不错的解决方案,但请注意 IE 不支持 includes() 方法 (developer.mozilla.org/nl/docs/Web/JavaScript/Reference/…) 这不安全。您应该只从字符串的开头进行测试,因为引荐来源网址可以将您的主机作为其自身的一个子集:例如“notactuallygoogle.com”将与您的方法匹配“google.com”。

以上是关于如何确定 document.referrer 是不是来自我自己的站点?的主要内容,如果未能解决你的问题,请参考以下文章

js确定来源页然后跳转

document.referrer

javascript document.referrer 用法

问题是 document.referrer 不工作

JS获取上一访问页面URL地址document.referrer实践2

带有完整查询字符串的 Javascript document.referrer