我想检查我的网站的访客在来到我的网站之前是否已经访问过另一个特定的网站。
我知道如何使用JS和PHP检查(通过引荐信息)用户是否刚刚从那个网站来到我的网站,但我想能够检测他们以前是否曾经访问过该网站(而不仅仅是在来到我的网站之前立即访问)。这些信息可以被检测到吗?
我想检查我的网站的访客在来到我的网站之前是否已经访问过另一个特定的网站。
我知道如何使用JS和PHP检查(通过引荐信息)用户是否刚刚从那个网站来到我的网站,但我想能够检测他们以前是否曾经访问过该网站(而不仅仅是在来到我的网站之前立即访问)。这些信息可以被检测到吗?
以前可以使用 JavaScript 和 CSS 伪类 :visited
来实现,但是浏览器已经修复了这个漏洞。
假设您想知道站点用户是否访问了google.com。然后,在您的页面中插入一个指向google的链接,并为访问的链接设置唯一的样式,其效果是事先已知的。在下面的示例中,访问过的链接将被着色为#012345
。
<style>
a:visited {
color: #012345;
}
</style>
<a href="http://www.google.com"></a>
<a href="http://www.amazon.com"></a>
接着,遍历页面中插入的每个链接,并获取它的颜色。如果对于上述示例它是#012345
,那么用户已经访问了该链接。然而,你无法实际访问他们的历史记录以知道他们访问过哪些网站。这更像是一个轮询过程。
如果您不介意概率性答案,您可以计时查询有关主机的DNS查找需要多长时间。如果DNS答案非常快,则可能最近已经为该主机执行了DNS请求。如果DNS答案返回较慢,则可能最近没有为该主机执行DNS请求。当然,我的电缆调制解调器将提供比CDMA或GSM手机更快的结果,因此它只在单台机器上比较几个站点时才有用。
编辑,针对Alex关于ISP DNS缓存的观点:
例如:使用本地DNS缓存,我的域名初始查询平均需要1.6秒。(我认为是因为缓存非常冷,需要查找.com、.co.uk和.co.jp名称服务器。)热缓存查询平均需要0.006秒。我的DNS缓存是递归解析器,因此不使用我的ISP的缓存解析器。
如果不使用我的本地DNS缓存并使用我的可爱路由器上的DNS缓存,则我的初始查询平均需要0.910秒,热缓存查询平均需要0.514秒。我不知道节省的0.4秒是来自我的路由器的DNS缓存还是我的ISP的缓存。但即使是0.4秒,在Javascript中也应该可见。
有足够的数据可以猜测:如果第一次和第二次解析域名的时间相似,那么您可以假设缓存是热的,并且地址最近被使用过。(也许在ISP级别上很热,但无论如何这被营销为一种概率方法。 :) 如果时间不同,则可以假设缓存是冷的。
当使用我的ISP的DNS时,我猜测了九个“热”域和九个“冷”域,热域的平均查找时间为0.226秒,冷域的平均查找时间为0.308秒。 0.082秒的差异可能不足以在JavaScript中注意到,而且与使用本地缓存或我的可爱小型路由器进行DNS的已知热和已知冷查找之间的差异相比,它绝对微不足道。
当然,“热”和“冷”是相对于每个单独域的TTL而言的。
:visited
选择器以解决此问题。 - kingjeffrey