用JavaScript或PHP可以检测访客的浏览历史吗?

14

我想检查我的网站的访客在来到我的网站之前是否已经访问过另一个特定的网站。

我知道如何使用JS和PHP检查(通过引荐信息)用户是否刚刚从那个网站来到我的网站,但我想能够检测他们以前是否曾经访问过该网站(而不仅仅是在来到我的网站之前立即访问)。这些信息可以被检测到吗?

5个回答

16

8
虽然我相信最近版本的 Firefox 已经部分关闭了这个“功能”。 - casablanca
很棒的技巧,谢谢。虽然我不想侵犯访客的隐私,但我只是出于严格的技术原因需要这样做。 - Lilacs
+1,尽管Safari 5已经删除了:visited选择器以解决此问题。 - kingjeffrey

10

2
我喜欢你提供的方式,既说明了可能性又指出了问题,而不是只有其中之一。干得好。 - balupton
lol,第一个链接的图表显示拥有运行速度较慢的软件可以带来好处 - 速度越慢越好 :) 从那个角度来看,IE是世界上最好的浏览器。 - Anurag
看起来这个答案中的第一个链接现在已经失效了。 - Anderson Green

4
当然可以!只需向另一个站点询问是否可以在其站点上弹出一个脚本,以便将所需的信息传递给您的系统即可。 ;)

想知道为什么在使用CSS hack之前从未考虑过那个方法。 - TheLQ

3
有一个技巧可以实现此操作,但由于不同浏览器可能会试图隐藏这些信息,因此您无法确定地为所有浏览器进行操作。而且,您只能通过客户端来确定,而不能通过服务器端来确定。正如@SLaks在我打字时所说的那样,想法是操纵已访问链接的样式表。

假设您想知道站点用户是否访问了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,那么用户已经访问了该链接。然而,你无法实际访问他们的历史记录以知道他们访问过哪些网站。这更像是一个轮询过程。


1

如果您不介意概率性答案,您可以计时查询有关主机的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而言的。


1
我不知道这有多可靠。很多ISP都有自己的DNS缓存,许多用户都在使用它们,对吧? - alex
顺便说一下,我觉得你把我的名字搞混了。我不再用Eric这个名字了 :P - alex
@alex 叹气 不确定我怎么搞砸了 :) 抱歉 - sarnold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接