如何确定document.referrer是否来自我自己的网站?

时间:2010-12-06 02:46:59

标签: javascript document referrer

每次请求页面时,我都会获得它所来自的页面的引荐来源。我需要跟踪来自其他网站的推荐人,我不想跟踪我的网站中从一个页面到另一个页面。我怎么能这样做?

5 个答案:

答案 0 :(得分:37)

document.referrer.indexOf(location.protocol + "//" + location.host) === 0;

答案 1 :(得分:1)

最初发布于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;
}

答案 2 :(得分:0)

解决方案提供的工作是在网站中没有子域的情况下,如果存在子域,那么我们必须在域本身之前检查是否存在任何子域:

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

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

答案 3 :(得分:0)

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

URL syntax diagram

以这种方式检查:

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`.

答案 4 :(得分:-1)

document.referrer.includes(location.host);