18

每次请求一个页面时,我都会得到它来自的页面的引用者。我只需要跟踪来自其他网站的引荐来源网址,我不想在我的网站中跟踪从一个页面到另一个页面。我怎样才能做到这一点?

4

5 回答 5

42
document.referrer.indexOf(location.protocol + "//" + location.host) === 0;
于 2010-12-06T03:13:38.187 回答
1

最初发表于JavaScript - 我是推荐人吗?

当有人第一次访问我们的网站时,我们会将推荐人存储在 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;
}
于 2010-12-06T02:47:32.023 回答
0

如果网站中没有子域,则提出的解决方案有效,如果存在子域,那么我们必须在域本身之前检查是否存在任何子域:

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

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

于 2013-08-14T19:26:42.687 回答
0

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

网址语法图

以这种方式检查:

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

.

于 2019-07-02T12:24:06.127 回答
-2
document.referrer.includes(location.host);
于 2017-12-20T11:38:26.903 回答