繁体   English   中英

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

[英]How can I determine if the document.referrer is from my own site?

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

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

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

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

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

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

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

URL语法图

检查一下:

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

document.referrer.includes(location.host);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM